1/* 2 * Copyright (C) 2013-2015 Chelsio Communications. All rights reserved. 3 * 4 * This program is free software; you can redistribute it and/or modify it 5 * under the terms and conditions of the GNU General Public License, 6 * version 2, as published by the Free Software Foundation. 7 * 8 * This program is distributed in the hope it will be useful, but WITHOUT 9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * more details. 12 * 13 * The full GNU General Public License is included in this distribution in 14 * the file called "COPYING". 15 * 16 */ 17 18#include <linux/firmware.h> 19#include <linux/mdio.h> 20 21#include "cxgb4.h" 22#include "t4_regs.h" 23#include "t4fw_api.h" 24 25#define EEPROM_MAGIC 0x38E2F10C 26 27static u32 get_msglevel(struct net_device *dev) 28{ 29 return netdev2adap(dev)->msg_enable; 30} 31 32static void set_msglevel(struct net_device *dev, u32 val) 33{ 34 netdev2adap(dev)->msg_enable = val; 35} 36 37static const char stats_strings[][ETH_GSTRING_LEN] = { 38 "TxOctetsOK ", 39 "TxFramesOK ", 40 "TxBroadcastFrames ", 41 "TxMulticastFrames ", 42 "TxUnicastFrames ", 43 "TxErrorFrames ", 44 45 "TxFrames64 ", 46 "TxFrames65To127 ", 47 "TxFrames128To255 ", 48 "TxFrames256To511 ", 49 "TxFrames512To1023 ", 50 "TxFrames1024To1518 ", 51 "TxFrames1519ToMax ", 52 53 "TxFramesDropped ", 54 "TxPauseFrames ", 55 "TxPPP0Frames ", 56 "TxPPP1Frames ", 57 "TxPPP2Frames ", 58 "TxPPP3Frames ", 59 "TxPPP4Frames ", 60 "TxPPP5Frames ", 61 "TxPPP6Frames ", 62 "TxPPP7Frames ", 63 64 "RxOctetsOK ", 65 "RxFramesOK ", 66 "RxBroadcastFrames ", 67 "RxMulticastFrames ", 68 "RxUnicastFrames ", 69 70 "RxFramesTooLong ", 71 "RxJabberErrors ", 72 "RxFCSErrors ", 73 "RxLengthErrors ", 74 "RxSymbolErrors ", 75 "RxRuntFrames ", 76 77 "RxFrames64 ", 78 "RxFrames65To127 ", 79 "RxFrames128To255 ", 80 "RxFrames256To511 ", 81 "RxFrames512To1023 ", 82 "RxFrames1024To1518 ", 83 "RxFrames1519ToMax ", 84 85 "RxPauseFrames ", 86 "RxPPP0Frames ", 87 "RxPPP1Frames ", 88 "RxPPP2Frames ", 89 "RxPPP3Frames ", 90 "RxPPP4Frames ", 91 "RxPPP5Frames ", 92 "RxPPP6Frames ", 93 "RxPPP7Frames ", 94 95 "RxBG0FramesDropped ", 96 "RxBG1FramesDropped ", 97 "RxBG2FramesDropped ", 98 "RxBG3FramesDropped ", 99 "RxBG0FramesTrunc ", 100 "RxBG1FramesTrunc ", 101 "RxBG2FramesTrunc ", 102 "RxBG3FramesTrunc ", 103 104 "TSO ", 105 "TxCsumOffload ", 106 "RxCsumGood ", 107 "VLANextractions ", 108 "VLANinsertions ", 109 "GROpackets ", 110 "GROmerged ", 111 "WriteCoalSuccess ", 112 "WriteCoalFail ", 113}; 114 115static int get_sset_count(struct net_device *dev, int sset) 116{ 117 switch (sset) { 118 case ETH_SS_STATS: 119 return ARRAY_SIZE(stats_strings); 120 default: 121 return -EOPNOTSUPP; 122 } 123} 124 125static int get_regs_len(struct net_device *dev) 126{ 127 struct adapter *adap = netdev2adap(dev); 128 129 return t4_get_regs_len(adap); 130} 131 132static int get_eeprom_len(struct net_device *dev) 133{ 134 return EEPROMSIZE; 135} 136 137static void get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) 138{ 139 struct adapter *adapter = netdev2adap(dev); 140 u32 exprom_vers; 141 142 strlcpy(info->driver, cxgb4_driver_name, sizeof(info->driver)); 143 strlcpy(info->version, cxgb4_driver_version, 144 sizeof(info->version)); 145 strlcpy(info->bus_info, pci_name(adapter->pdev), 146 sizeof(info->bus_info)); 147 148 if (adapter->params.fw_vers) 149 snprintf(info->fw_version, sizeof(info->fw_version), 150 "%u.%u.%u.%u, TP %u.%u.%u.%u", 151 FW_HDR_FW_VER_MAJOR_G(adapter->params.fw_vers), 152 FW_HDR_FW_VER_MINOR_G(adapter->params.fw_vers), 153 FW_HDR_FW_VER_MICRO_G(adapter->params.fw_vers), 154 FW_HDR_FW_VER_BUILD_G(adapter->params.fw_vers), 155 FW_HDR_FW_VER_MAJOR_G(adapter->params.tp_vers), 156 FW_HDR_FW_VER_MINOR_G(adapter->params.tp_vers), 157 FW_HDR_FW_VER_MICRO_G(adapter->params.tp_vers), 158 FW_HDR_FW_VER_BUILD_G(adapter->params.tp_vers)); 159 160 if (!t4_get_exprom_version(adapter, &exprom_vers)) 161 snprintf(info->erom_version, sizeof(info->erom_version), 162 "%u.%u.%u.%u", 163 FW_HDR_FW_VER_MAJOR_G(exprom_vers), 164 FW_HDR_FW_VER_MINOR_G(exprom_vers), 165 FW_HDR_FW_VER_MICRO_G(exprom_vers), 166 FW_HDR_FW_VER_BUILD_G(exprom_vers)); 167} 168 169static void get_strings(struct net_device *dev, u32 stringset, u8 *data) 170{ 171 if (stringset == ETH_SS_STATS) 172 memcpy(data, stats_strings, sizeof(stats_strings)); 173} 174 175/* port stats maintained per queue of the port. They should be in the same 176 * order as in stats_strings above. 177 */ 178struct queue_port_stats { 179 u64 tso; 180 u64 tx_csum; 181 u64 rx_csum; 182 u64 vlan_ex; 183 u64 vlan_ins; 184 u64 gro_pkts; 185 u64 gro_merged; 186}; 187 188static void collect_sge_port_stats(const struct adapter *adap, 189 const struct port_info *p, 190 struct queue_port_stats *s) 191{ 192 int i; 193 const struct sge_eth_txq *tx = &adap->sge.ethtxq[p->first_qset]; 194 const struct sge_eth_rxq *rx = &adap->sge.ethrxq[p->first_qset]; 195 196 memset(s, 0, sizeof(*s)); 197 for (i = 0; i < p->nqsets; i++, rx++, tx++) { 198 s->tso += tx->tso; 199 s->tx_csum += tx->tx_cso; 200 s->rx_csum += rx->stats.rx_cso; 201 s->vlan_ex += rx->stats.vlan_ex; 202 s->vlan_ins += tx->vlan_ins; 203 s->gro_pkts += rx->stats.lro_pkts; 204 s->gro_merged += rx->stats.lro_merged; 205 } 206} 207 208static void get_stats(struct net_device *dev, struct ethtool_stats *stats, 209 u64 *data) 210{ 211 struct port_info *pi = netdev_priv(dev); 212 struct adapter *adapter = pi->adapter; 213 u32 val1, val2; 214 215 t4_get_port_stats(adapter, pi->tx_chan, (struct port_stats *)data); 216 217 data += sizeof(struct port_stats) / sizeof(u64); 218 collect_sge_port_stats(adapter, pi, (struct queue_port_stats *)data); 219 data += sizeof(struct queue_port_stats) / sizeof(u64); 220 if (!is_t4(adapter->params.chip)) { 221 t4_write_reg(adapter, SGE_STAT_CFG_A, STATSOURCE_T5_V(7)); 222 val1 = t4_read_reg(adapter, SGE_STAT_TOTAL_A); 223 val2 = t4_read_reg(adapter, SGE_STAT_MATCH_A); 224 *data = val1 - val2; 225 data++; 226 *data = val2; 227 data++; 228 } else { 229 memset(data, 0, 2 * sizeof(u64)); 230 *data += 2; 231 } 232} 233 234static void get_regs(struct net_device *dev, struct ethtool_regs *regs, 235 void *buf) 236{ 237 struct adapter *adap = netdev2adap(dev); 238 size_t buf_size; 239 240 buf_size = t4_get_regs_len(adap); 241 regs->version = mk_adap_vers(adap); 242 t4_get_regs(adap, buf, buf_size); 243} 244 245static int restart_autoneg(struct net_device *dev) 246{ 247 struct port_info *p = netdev_priv(dev); 248 249 if (!netif_running(dev)) 250 return -EAGAIN; 251 if (p->link_cfg.autoneg != AUTONEG_ENABLE) 252 return -EINVAL; 253 t4_restart_aneg(p->adapter, p->adapter->fn, p->tx_chan); 254 return 0; 255} 256 257static int identify_port(struct net_device *dev, 258 enum ethtool_phys_id_state state) 259{ 260 unsigned int val; 261 struct adapter *adap = netdev2adap(dev); 262 263 if (state == ETHTOOL_ID_ACTIVE) 264 val = 0xffff; 265 else if (state == ETHTOOL_ID_INACTIVE) 266 val = 0; 267 else 268 return -EINVAL; 269 270 return t4_identify_port(adap, adap->fn, netdev2pinfo(dev)->viid, val); 271} 272 273static unsigned int from_fw_linkcaps(enum fw_port_type type, unsigned int caps) 274{ 275 unsigned int v = 0; 276 277 if (type == FW_PORT_TYPE_BT_SGMII || type == FW_PORT_TYPE_BT_XFI || 278 type == FW_PORT_TYPE_BT_XAUI) { 279 v |= SUPPORTED_TP; 280 if (caps & FW_PORT_CAP_SPEED_100M) 281 v |= SUPPORTED_100baseT_Full; 282 if (caps & FW_PORT_CAP_SPEED_1G) 283 v |= SUPPORTED_1000baseT_Full; 284 if (caps & FW_PORT_CAP_SPEED_10G) 285 v |= SUPPORTED_10000baseT_Full; 286 } else if (type == FW_PORT_TYPE_KX4 || type == FW_PORT_TYPE_KX) { 287 v |= SUPPORTED_Backplane; 288 if (caps & FW_PORT_CAP_SPEED_1G) 289 v |= SUPPORTED_1000baseKX_Full; 290 if (caps & FW_PORT_CAP_SPEED_10G) 291 v |= SUPPORTED_10000baseKX4_Full; 292 } else if (type == FW_PORT_TYPE_KR) { 293 v |= SUPPORTED_Backplane | SUPPORTED_10000baseKR_Full; 294 } else if (type == FW_PORT_TYPE_BP_AP) { 295 v |= SUPPORTED_Backplane | SUPPORTED_10000baseR_FEC | 296 SUPPORTED_10000baseKR_Full | SUPPORTED_1000baseKX_Full; 297 } else if (type == FW_PORT_TYPE_BP4_AP) { 298 v |= SUPPORTED_Backplane | SUPPORTED_10000baseR_FEC | 299 SUPPORTED_10000baseKR_Full | SUPPORTED_1000baseKX_Full | 300 SUPPORTED_10000baseKX4_Full; 301 } else if (type == FW_PORT_TYPE_FIBER_XFI || 302 type == FW_PORT_TYPE_FIBER_XAUI || 303 type == FW_PORT_TYPE_SFP || 304 type == FW_PORT_TYPE_QSFP_10G || 305 type == FW_PORT_TYPE_QSA) { 306 v |= SUPPORTED_FIBRE; 307 if (caps & FW_PORT_CAP_SPEED_1G) 308 v |= SUPPORTED_1000baseT_Full; 309 if (caps & FW_PORT_CAP_SPEED_10G) 310 v |= SUPPORTED_10000baseT_Full; 311 } else if (type == FW_PORT_TYPE_BP40_BA || 312 type == FW_PORT_TYPE_QSFP) { 313 v |= SUPPORTED_40000baseSR4_Full; 314 v |= SUPPORTED_FIBRE; 315 } 316 317 if (caps & FW_PORT_CAP_ANEG) 318 v |= SUPPORTED_Autoneg; 319 return v; 320} 321 322static unsigned int to_fw_linkcaps(unsigned int caps) 323{ 324 unsigned int v = 0; 325 326 if (caps & ADVERTISED_100baseT_Full) 327 v |= FW_PORT_CAP_SPEED_100M; 328 if (caps & ADVERTISED_1000baseT_Full) 329 v |= FW_PORT_CAP_SPEED_1G; 330 if (caps & ADVERTISED_10000baseT_Full) 331 v |= FW_PORT_CAP_SPEED_10G; 332 if (caps & ADVERTISED_40000baseSR4_Full) 333 v |= FW_PORT_CAP_SPEED_40G; 334 return v; 335} 336 337static int get_settings(struct net_device *dev, struct ethtool_cmd *cmd) 338{ 339 const struct port_info *p = netdev_priv(dev); 340 341 if (p->port_type == FW_PORT_TYPE_BT_SGMII || 342 p->port_type == FW_PORT_TYPE_BT_XFI || 343 p->port_type == FW_PORT_TYPE_BT_XAUI) { 344 cmd->port = PORT_TP; 345 } else if (p->port_type == FW_PORT_TYPE_FIBER_XFI || 346 p->port_type == FW_PORT_TYPE_FIBER_XAUI) { 347 cmd->port = PORT_FIBRE; 348 } else if (p->port_type == FW_PORT_TYPE_SFP || 349 p->port_type == FW_PORT_TYPE_QSFP_10G || 350 p->port_type == FW_PORT_TYPE_QSA || 351 p->port_type == FW_PORT_TYPE_QSFP) { 352 if (p->mod_type == FW_PORT_MOD_TYPE_LR || 353 p->mod_type == FW_PORT_MOD_TYPE_SR || 354 p->mod_type == FW_PORT_MOD_TYPE_ER || 355 p->mod_type == FW_PORT_MOD_TYPE_LRM) 356 cmd->port = PORT_FIBRE; 357 else if (p->mod_type == FW_PORT_MOD_TYPE_TWINAX_PASSIVE || 358 p->mod_type == FW_PORT_MOD_TYPE_TWINAX_ACTIVE) 359 cmd->port = PORT_DA; 360 else 361 cmd->port = PORT_OTHER; 362 } else { 363 cmd->port = PORT_OTHER; 364 } 365 366 if (p->mdio_addr >= 0) { 367 cmd->phy_address = p->mdio_addr; 368 cmd->transceiver = XCVR_EXTERNAL; 369 cmd->mdio_support = p->port_type == FW_PORT_TYPE_BT_SGMII ? 370 MDIO_SUPPORTS_C22 : MDIO_SUPPORTS_C45; 371 } else { 372 cmd->phy_address = 0; /* not really, but no better option */ 373 cmd->transceiver = XCVR_INTERNAL; 374 cmd->mdio_support = 0; 375 } 376 377 cmd->supported = from_fw_linkcaps(p->port_type, p->link_cfg.supported); 378 cmd->advertising = from_fw_linkcaps(p->port_type, 379 p->link_cfg.advertising); 380 ethtool_cmd_speed_set(cmd, 381 netif_carrier_ok(dev) ? p->link_cfg.speed : 0); 382 cmd->duplex = DUPLEX_FULL; 383 cmd->autoneg = p->link_cfg.autoneg; 384 cmd->maxtxpkt = 0; 385 cmd->maxrxpkt = 0; 386 return 0; 387} 388 389static unsigned int speed_to_caps(int speed) 390{ 391 if (speed == 100) 392 return FW_PORT_CAP_SPEED_100M; 393 if (speed == 1000) 394 return FW_PORT_CAP_SPEED_1G; 395 if (speed == 10000) 396 return FW_PORT_CAP_SPEED_10G; 397 if (speed == 40000) 398 return FW_PORT_CAP_SPEED_40G; 399 return 0; 400} 401 402static int set_settings(struct net_device *dev, struct ethtool_cmd *cmd) 403{ 404 unsigned int cap; 405 struct port_info *p = netdev_priv(dev); 406 struct link_config *lc = &p->link_cfg; 407 u32 speed = ethtool_cmd_speed(cmd); 408 409 if (cmd->duplex != DUPLEX_FULL) /* only full-duplex supported */ 410 return -EINVAL; 411 412 if (!(lc->supported & FW_PORT_CAP_ANEG)) { 413 /* PHY offers a single speed. See if that's what's 414 * being requested. 415 */ 416 if (cmd->autoneg == AUTONEG_DISABLE && 417 (lc->supported & speed_to_caps(speed))) 418 return 0; 419 return -EINVAL; 420 } 421 422 if (cmd->autoneg == AUTONEG_DISABLE) { 423 cap = speed_to_caps(speed); 424 425 if (!(lc->supported & cap) || 426 (speed == 1000) || 427 (speed == 10000) || 428 (speed == 40000)) 429 return -EINVAL; 430 lc->requested_speed = cap; 431 lc->advertising = 0; 432 } else { 433 cap = to_fw_linkcaps(cmd->advertising); 434 if (!(lc->supported & cap)) 435 return -EINVAL; 436 lc->requested_speed = 0; 437 lc->advertising = cap | FW_PORT_CAP_ANEG; 438 } 439 lc->autoneg = cmd->autoneg; 440 441 if (netif_running(dev)) 442 return t4_link_start(p->adapter, p->adapter->fn, p->tx_chan, 443 lc); 444 return 0; 445} 446 447static void get_pauseparam(struct net_device *dev, 448 struct ethtool_pauseparam *epause) 449{ 450 struct port_info *p = netdev_priv(dev); 451 452 epause->autoneg = (p->link_cfg.requested_fc & PAUSE_AUTONEG) != 0; 453 epause->rx_pause = (p->link_cfg.fc & PAUSE_RX) != 0; 454 epause->tx_pause = (p->link_cfg.fc & PAUSE_TX) != 0; 455} 456 457static int set_pauseparam(struct net_device *dev, 458 struct ethtool_pauseparam *epause) 459{ 460 struct port_info *p = netdev_priv(dev); 461 struct link_config *lc = &p->link_cfg; 462 463 if (epause->autoneg == AUTONEG_DISABLE) 464 lc->requested_fc = 0; 465 else if (lc->supported & FW_PORT_CAP_ANEG) 466 lc->requested_fc = PAUSE_AUTONEG; 467 else 468 return -EINVAL; 469 470 if (epause->rx_pause) 471 lc->requested_fc |= PAUSE_RX; 472 if (epause->tx_pause) 473 lc->requested_fc |= PAUSE_TX; 474 if (netif_running(dev)) 475 return t4_link_start(p->adapter, p->adapter->fn, p->tx_chan, 476 lc); 477 return 0; 478} 479 480static void get_sge_param(struct net_device *dev, struct ethtool_ringparam *e) 481{ 482 const struct port_info *pi = netdev_priv(dev); 483 const struct sge *s = &pi->adapter->sge; 484 485 e->rx_max_pending = MAX_RX_BUFFERS; 486 e->rx_mini_max_pending = MAX_RSPQ_ENTRIES; 487 e->rx_jumbo_max_pending = 0; 488 e->tx_max_pending = MAX_TXQ_ENTRIES; 489 490 e->rx_pending = s->ethrxq[pi->first_qset].fl.size - 8; 491 e->rx_mini_pending = s->ethrxq[pi->first_qset].rspq.size; 492 e->rx_jumbo_pending = 0; 493 e->tx_pending = s->ethtxq[pi->first_qset].q.size; 494} 495 496static int set_sge_param(struct net_device *dev, struct ethtool_ringparam *e) 497{ 498 int i; 499 const struct port_info *pi = netdev_priv(dev); 500 struct adapter *adapter = pi->adapter; 501 struct sge *s = &adapter->sge; 502 503 if (e->rx_pending > MAX_RX_BUFFERS || e->rx_jumbo_pending || 504 e->tx_pending > MAX_TXQ_ENTRIES || 505 e->rx_mini_pending > MAX_RSPQ_ENTRIES || 506 e->rx_mini_pending < MIN_RSPQ_ENTRIES || 507 e->rx_pending < MIN_FL_ENTRIES || e->tx_pending < MIN_TXQ_ENTRIES) 508 return -EINVAL; 509 510 if (adapter->flags & FULL_INIT_DONE) 511 return -EBUSY; 512 513 for (i = 0; i < pi->nqsets; ++i) { 514 s->ethtxq[pi->first_qset + i].q.size = e->tx_pending; 515 s->ethrxq[pi->first_qset + i].fl.size = e->rx_pending + 8; 516 s->ethrxq[pi->first_qset + i].rspq.size = e->rx_mini_pending; 517 } 518 return 0; 519} 520 521/** 522 * set_rx_intr_params - set a net devices's RX interrupt holdoff paramete! 523 * @dev: the network device 524 * @us: the hold-off time in us, or 0 to disable timer 525 * @cnt: the hold-off packet count, or 0 to disable counter 526 * 527 * Set the RX interrupt hold-off parameters for a network device. 528 */ 529static int set_rx_intr_params(struct net_device *dev, 530 unsigned int us, unsigned int cnt) 531{ 532 int i, err; 533 struct port_info *pi = netdev_priv(dev); 534 struct adapter *adap = pi->adapter; 535 struct sge_eth_rxq *q = &adap->sge.ethrxq[pi->first_qset]; 536 537 for (i = 0; i < pi->nqsets; i++, q++) { 538 err = cxgb4_set_rspq_intr_params(&q->rspq, us, cnt); 539 if (err) 540 return err; 541 } 542 return 0; 543} 544 545static int set_adaptive_rx_setting(struct net_device *dev, int adaptive_rx) 546{ 547 int i; 548 struct port_info *pi = netdev_priv(dev); 549 struct adapter *adap = pi->adapter; 550 struct sge_eth_rxq *q = &adap->sge.ethrxq[pi->first_qset]; 551 552 for (i = 0; i < pi->nqsets; i++, q++) 553 q->rspq.adaptive_rx = adaptive_rx; 554 555 return 0; 556} 557 558static int get_adaptive_rx_setting(struct net_device *dev) 559{ 560 struct port_info *pi = netdev_priv(dev); 561 struct adapter *adap = pi->adapter; 562 struct sge_eth_rxq *q = &adap->sge.ethrxq[pi->first_qset]; 563 564 return q->rspq.adaptive_rx; 565} 566 567static int set_coalesce(struct net_device *dev, struct ethtool_coalesce *c) 568{ 569 set_adaptive_rx_setting(dev, c->use_adaptive_rx_coalesce); 570 return set_rx_intr_params(dev, c->rx_coalesce_usecs, 571 c->rx_max_coalesced_frames); 572} 573 574static int get_coalesce(struct net_device *dev, struct ethtool_coalesce *c) 575{ 576 const struct port_info *pi = netdev_priv(dev); 577 const struct adapter *adap = pi->adapter; 578 const struct sge_rspq *rq = &adap->sge.ethrxq[pi->first_qset].rspq; 579 580 c->rx_coalesce_usecs = qtimer_val(adap, rq); 581 c->rx_max_coalesced_frames = (rq->intr_params & QINTR_CNT_EN) ? 582 adap->sge.counter_val[rq->pktcnt_idx] : 0; 583 c->use_adaptive_rx_coalesce = get_adaptive_rx_setting(dev); 584 return 0; 585} 586 587/** 588 * eeprom_ptov - translate a physical EEPROM address to virtual 589 * @phys_addr: the physical EEPROM address 590 * @fn: the PCI function number 591 * @sz: size of function-specific area 592 * 593 * Translate a physical EEPROM address to virtual. The first 1K is 594 * accessed through virtual addresses starting at 31K, the rest is 595 * accessed through virtual addresses starting at 0. 596 * 597 * The mapping is as follows: 598 * [0..1K) -> [31K..32K) 599 * [1K..1K+A) -> [31K-A..31K) 600 * [1K+A..ES) -> [0..ES-A-1K) 601 * 602 * where A = @fn * @sz, and ES = EEPROM size. 603 */ 604static int eeprom_ptov(unsigned int phys_addr, unsigned int fn, unsigned int sz) 605{ 606 fn *= sz; 607 if (phys_addr < 1024) 608 return phys_addr + (31 << 10); 609 if (phys_addr < 1024 + fn) 610 return 31744 - fn + phys_addr - 1024; 611 if (phys_addr < EEPROMSIZE) 612 return phys_addr - 1024 - fn; 613 return -EINVAL; 614} 615 616/* The next two routines implement eeprom read/write from physical addresses. 617 */ 618static int eeprom_rd_phys(struct adapter *adap, unsigned int phys_addr, u32 *v) 619{ 620 int vaddr = eeprom_ptov(phys_addr, adap->fn, EEPROMPFSIZE); 621 622 if (vaddr >= 0) 623 vaddr = pci_read_vpd(adap->pdev, vaddr, sizeof(u32), v); 624 return vaddr < 0 ? vaddr : 0; 625} 626 627static int eeprom_wr_phys(struct adapter *adap, unsigned int phys_addr, u32 v) 628{ 629 int vaddr = eeprom_ptov(phys_addr, adap->fn, EEPROMPFSIZE); 630 631 if (vaddr >= 0) 632 vaddr = pci_write_vpd(adap->pdev, vaddr, sizeof(u32), &v); 633 return vaddr < 0 ? vaddr : 0; 634} 635 636#define EEPROM_MAGIC 0x38E2F10C 637 638static int get_eeprom(struct net_device *dev, struct ethtool_eeprom *e, 639 u8 *data) 640{ 641 int i, err = 0; 642 struct adapter *adapter = netdev2adap(dev); 643 u8 *buf = kmalloc(EEPROMSIZE, GFP_KERNEL); 644 645 if (!buf) 646 return -ENOMEM; 647 648 e->magic = EEPROM_MAGIC; 649 for (i = e->offset & ~3; !err && i < e->offset + e->len; i += 4) 650 err = eeprom_rd_phys(adapter, i, (u32 *)&buf[i]); 651 652 if (!err) 653 memcpy(data, buf + e->offset, e->len); 654 kfree(buf); 655 return err; 656} 657 658static int set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, 659 u8 *data) 660{ 661 u8 *buf; 662 int err = 0; 663 u32 aligned_offset, aligned_len, *p; 664 struct adapter *adapter = netdev2adap(dev); 665 666 if (eeprom->magic != EEPROM_MAGIC) 667 return -EINVAL; 668 669 aligned_offset = eeprom->offset & ~3; 670 aligned_len = (eeprom->len + (eeprom->offset & 3) + 3) & ~3; 671 672 if (adapter->fn > 0) { 673 u32 start = 1024 + adapter->fn * EEPROMPFSIZE; 674 675 if (aligned_offset < start || 676 aligned_offset + aligned_len > start + EEPROMPFSIZE) 677 return -EPERM; 678 } 679 680 if (aligned_offset != eeprom->offset || aligned_len != eeprom->len) { 681 /* RMW possibly needed for first or last words. 682 */ 683 buf = kmalloc(aligned_len, GFP_KERNEL); 684 if (!buf) 685 return -ENOMEM; 686 err = eeprom_rd_phys(adapter, aligned_offset, (u32 *)buf); 687 if (!err && aligned_len > 4) 688 err = eeprom_rd_phys(adapter, 689 aligned_offset + aligned_len - 4, 690 (u32 *)&buf[aligned_len - 4]); 691 if (err) 692 goto out; 693 memcpy(buf + (eeprom->offset & 3), data, eeprom->len); 694 } else { 695 buf = data; 696 } 697 698 err = t4_seeprom_wp(adapter, false); 699 if (err) 700 goto out; 701 702 for (p = (u32 *)buf; !err && aligned_len; aligned_len -= 4, p++) { 703 err = eeprom_wr_phys(adapter, aligned_offset, *p); 704 aligned_offset += 4; 705 } 706 707 if (!err) 708 err = t4_seeprom_wp(adapter, true); 709out: 710 if (buf != data) 711 kfree(buf); 712 return err; 713} 714 715static int set_flash(struct net_device *netdev, struct ethtool_flash *ef) 716{ 717 int ret; 718 const struct firmware *fw; 719 struct adapter *adap = netdev2adap(netdev); 720 unsigned int mbox = PCIE_FW_MASTER_M + 1; 721 722 ef->data[sizeof(ef->data) - 1] = '\0'; 723 ret = request_firmware(&fw, ef->data, adap->pdev_dev); 724 if (ret < 0) 725 return ret; 726 727 /* If the adapter has been fully initialized then we'll go ahead and 728 * try to get the firmware's cooperation in upgrading to the new 729 * firmware image otherwise we'll try to do the entire job from the 730 * host ... and we always "force" the operation in this path. 731 */ 732 if (adap->flags & FULL_INIT_DONE) 733 mbox = adap->mbox; 734 735 ret = t4_fw_upgrade(adap, mbox, fw->data, fw->size, 1); 736 release_firmware(fw); 737 if (!ret) 738 dev_info(adap->pdev_dev, 739 "loaded firmware %s, reload cxgb4 driver\n", ef->data); 740 return ret; 741} 742 743#define WOL_SUPPORTED (WAKE_BCAST | WAKE_MAGIC) 744#define BCAST_CRC 0xa0ccc1a6 745 746static void get_wol(struct net_device *dev, struct ethtool_wolinfo *wol) 747{ 748 wol->supported = WAKE_BCAST | WAKE_MAGIC; 749 wol->wolopts = netdev2adap(dev)->wol; 750 memset(&wol->sopass, 0, sizeof(wol->sopass)); 751} 752 753static int set_wol(struct net_device *dev, struct ethtool_wolinfo *wol) 754{ 755 int err = 0; 756 struct port_info *pi = netdev_priv(dev); 757 758 if (wol->wolopts & ~WOL_SUPPORTED) 759 return -EINVAL; 760 t4_wol_magic_enable(pi->adapter, pi->tx_chan, 761 (wol->wolopts & WAKE_MAGIC) ? dev->dev_addr : NULL); 762 if (wol->wolopts & WAKE_BCAST) { 763 err = t4_wol_pat_enable(pi->adapter, pi->tx_chan, 0xfe, ~0ULL, 764 ~0ULL, 0, false); 765 if (!err) 766 err = t4_wol_pat_enable(pi->adapter, pi->tx_chan, 1, 767 ~6ULL, ~0ULL, BCAST_CRC, true); 768 } else { 769 t4_wol_pat_enable(pi->adapter, pi->tx_chan, 0, 0, 0, 0, false); 770 } 771 return err; 772} 773 774static u32 get_rss_table_size(struct net_device *dev) 775{ 776 const struct port_info *pi = netdev_priv(dev); 777 778 return pi->rss_size; 779} 780 781static int get_rss_table(struct net_device *dev, u32 *p, u8 *key, u8 *hfunc) 782{ 783 const struct port_info *pi = netdev_priv(dev); 784 unsigned int n = pi->rss_size; 785 786 if (hfunc) 787 *hfunc = ETH_RSS_HASH_TOP; 788 if (!p) 789 return 0; 790 while (n--) 791 p[n] = pi->rss[n]; 792 return 0; 793} 794 795static int set_rss_table(struct net_device *dev, const u32 *p, const u8 *key, 796 const u8 hfunc) 797{ 798 unsigned int i; 799 struct port_info *pi = netdev_priv(dev); 800 801 /* We require at least one supported parameter to be changed and no 802 * change in any of the unsupported parameters 803 */ 804 if (key || 805 (hfunc != ETH_RSS_HASH_NO_CHANGE && hfunc != ETH_RSS_HASH_TOP)) 806 return -EOPNOTSUPP; 807 if (!p) 808 return 0; 809 810 for (i = 0; i < pi->rss_size; i++) 811 pi->rss[i] = p[i]; 812 if (pi->adapter->flags & FULL_INIT_DONE) 813 return cxgb4_write_rss(pi, pi->rss); 814 return 0; 815} 816 817static int get_rxnfc(struct net_device *dev, struct ethtool_rxnfc *info, 818 u32 *rules) 819{ 820 const struct port_info *pi = netdev_priv(dev); 821 822 switch (info->cmd) { 823 case ETHTOOL_GRXFH: { 824 unsigned int v = pi->rss_mode; 825 826 info->data = 0; 827 switch (info->flow_type) { 828 case TCP_V4_FLOW: 829 if (v & FW_RSS_VI_CONFIG_CMD_IP4FOURTUPEN_F) 830 info->data = RXH_IP_SRC | RXH_IP_DST | 831 RXH_L4_B_0_1 | RXH_L4_B_2_3; 832 else if (v & FW_RSS_VI_CONFIG_CMD_IP4TWOTUPEN_F) 833 info->data = RXH_IP_SRC | RXH_IP_DST; 834 break; 835 case UDP_V4_FLOW: 836 if ((v & FW_RSS_VI_CONFIG_CMD_IP4FOURTUPEN_F) && 837 (v & FW_RSS_VI_CONFIG_CMD_UDPEN_F)) 838 info->data = RXH_IP_SRC | RXH_IP_DST | 839 RXH_L4_B_0_1 | RXH_L4_B_2_3; 840 else if (v & FW_RSS_VI_CONFIG_CMD_IP4TWOTUPEN_F) 841 info->data = RXH_IP_SRC | RXH_IP_DST; 842 break; 843 case SCTP_V4_FLOW: 844 case AH_ESP_V4_FLOW: 845 case IPV4_FLOW: 846 if (v & FW_RSS_VI_CONFIG_CMD_IP4TWOTUPEN_F) 847 info->data = RXH_IP_SRC | RXH_IP_DST; 848 break; 849 case TCP_V6_FLOW: 850 if (v & FW_RSS_VI_CONFIG_CMD_IP6FOURTUPEN_F) 851 info->data = RXH_IP_SRC | RXH_IP_DST | 852 RXH_L4_B_0_1 | RXH_L4_B_2_3; 853 else if (v & FW_RSS_VI_CONFIG_CMD_IP6TWOTUPEN_F) 854 info->data = RXH_IP_SRC | RXH_IP_DST; 855 break; 856 case UDP_V6_FLOW: 857 if ((v & FW_RSS_VI_CONFIG_CMD_IP6FOURTUPEN_F) && 858 (v & FW_RSS_VI_CONFIG_CMD_UDPEN_F)) 859 info->data = RXH_IP_SRC | RXH_IP_DST | 860 RXH_L4_B_0_1 | RXH_L4_B_2_3; 861 else if (v & FW_RSS_VI_CONFIG_CMD_IP6TWOTUPEN_F) 862 info->data = RXH_IP_SRC | RXH_IP_DST; 863 break; 864 case SCTP_V6_FLOW: 865 case AH_ESP_V6_FLOW: 866 case IPV6_FLOW: 867 if (v & FW_RSS_VI_CONFIG_CMD_IP6TWOTUPEN_F) 868 info->data = RXH_IP_SRC | RXH_IP_DST; 869 break; 870 } 871 return 0; 872 } 873 case ETHTOOL_GRXRINGS: 874 info->data = pi->nqsets; 875 return 0; 876 } 877 return -EOPNOTSUPP; 878} 879 880static const struct ethtool_ops cxgb_ethtool_ops = { 881 .get_settings = get_settings, 882 .set_settings = set_settings, 883 .get_drvinfo = get_drvinfo, 884 .get_msglevel = get_msglevel, 885 .set_msglevel = set_msglevel, 886 .get_ringparam = get_sge_param, 887 .set_ringparam = set_sge_param, 888 .get_coalesce = get_coalesce, 889 .set_coalesce = set_coalesce, 890 .get_eeprom_len = get_eeprom_len, 891 .get_eeprom = get_eeprom, 892 .set_eeprom = set_eeprom, 893 .get_pauseparam = get_pauseparam, 894 .set_pauseparam = set_pauseparam, 895 .get_link = ethtool_op_get_link, 896 .get_strings = get_strings, 897 .set_phys_id = identify_port, 898 .nway_reset = restart_autoneg, 899 .get_sset_count = get_sset_count, 900 .get_ethtool_stats = get_stats, 901 .get_regs_len = get_regs_len, 902 .get_regs = get_regs, 903 .get_wol = get_wol, 904 .set_wol = set_wol, 905 .get_rxnfc = get_rxnfc, 906 .get_rxfh_indir_size = get_rss_table_size, 907 .get_rxfh = get_rss_table, 908 .set_rxfh = set_rss_table, 909 .flash_device = set_flash, 910}; 911 912void cxgb4_set_ethtool_ops(struct net_device *netdev) 913{ 914 netdev->ethtool_ops = &cxgb_ethtool_ops; 915} 916