at v2.6.29 767 lines 22 kB view raw
1/**************************************************************************** 2 * Driver for Solarflare Solarstorm network controllers and boards 3 * Copyright 2005-2006 Fen Systems Ltd. 4 * Copyright 2006-2008 Solarflare Communications Inc. 5 * 6 * This program is free software; you can redistribute it and/or modify it 7 * under the terms of the GNU General Public License version 2 as published 8 * by the Free Software Foundation, incorporated herein by reference. 9 */ 10 11#include <linux/netdevice.h> 12#include <linux/ethtool.h> 13#include <linux/rtnetlink.h> 14#include "net_driver.h" 15#include "workarounds.h" 16#include "selftest.h" 17#include "efx.h" 18#include "ethtool.h" 19#include "falcon.h" 20#include "spi.h" 21#include "mdio_10g.h" 22 23const char *efx_loopback_mode_names[] = { 24 [LOOPBACK_NONE] = "NONE", 25 [LOOPBACK_GMAC] = "GMAC", 26 [LOOPBACK_XGMII] = "XGMII", 27 [LOOPBACK_XGXS] = "XGXS", 28 [LOOPBACK_XAUI] = "XAUI", 29 [LOOPBACK_GPHY] = "GPHY", 30 [LOOPBACK_PHYXS] = "PHYXS", 31 [LOOPBACK_PCS] = "PCS", 32 [LOOPBACK_PMAPMD] = "PMA/PMD", 33 [LOOPBACK_NETWORK] = "NETWORK", 34}; 35 36struct ethtool_string { 37 char name[ETH_GSTRING_LEN]; 38}; 39 40struct efx_ethtool_stat { 41 const char *name; 42 enum { 43 EFX_ETHTOOL_STAT_SOURCE_mac_stats, 44 EFX_ETHTOOL_STAT_SOURCE_nic, 45 EFX_ETHTOOL_STAT_SOURCE_channel 46 } source; 47 unsigned offset; 48 u64(*get_stat) (void *field); /* Reader function */ 49}; 50 51/* Initialiser for a struct #efx_ethtool_stat with type-checking */ 52#define EFX_ETHTOOL_STAT(stat_name, source_name, field, field_type, \ 53 get_stat_function) { \ 54 .name = #stat_name, \ 55 .source = EFX_ETHTOOL_STAT_SOURCE_##source_name, \ 56 .offset = ((((field_type *) 0) == \ 57 &((struct efx_##source_name *)0)->field) ? \ 58 offsetof(struct efx_##source_name, field) : \ 59 offsetof(struct efx_##source_name, field)), \ 60 .get_stat = get_stat_function, \ 61} 62 63static u64 efx_get_uint_stat(void *field) 64{ 65 return *(unsigned int *)field; 66} 67 68static u64 efx_get_ulong_stat(void *field) 69{ 70 return *(unsigned long *)field; 71} 72 73static u64 efx_get_u64_stat(void *field) 74{ 75 return *(u64 *) field; 76} 77 78static u64 efx_get_atomic_stat(void *field) 79{ 80 return atomic_read((atomic_t *) field); 81} 82 83#define EFX_ETHTOOL_ULONG_MAC_STAT(field) \ 84 EFX_ETHTOOL_STAT(field, mac_stats, field, \ 85 unsigned long, efx_get_ulong_stat) 86 87#define EFX_ETHTOOL_U64_MAC_STAT(field) \ 88 EFX_ETHTOOL_STAT(field, mac_stats, field, \ 89 u64, efx_get_u64_stat) 90 91#define EFX_ETHTOOL_UINT_NIC_STAT(name) \ 92 EFX_ETHTOOL_STAT(name, nic, n_##name, \ 93 unsigned int, efx_get_uint_stat) 94 95#define EFX_ETHTOOL_ATOMIC_NIC_ERROR_STAT(field) \ 96 EFX_ETHTOOL_STAT(field, nic, field, \ 97 atomic_t, efx_get_atomic_stat) 98 99#define EFX_ETHTOOL_UINT_CHANNEL_STAT(field) \ 100 EFX_ETHTOOL_STAT(field, channel, n_##field, \ 101 unsigned int, efx_get_uint_stat) 102 103static struct efx_ethtool_stat efx_ethtool_stats[] = { 104 EFX_ETHTOOL_U64_MAC_STAT(tx_bytes), 105 EFX_ETHTOOL_U64_MAC_STAT(tx_good_bytes), 106 EFX_ETHTOOL_U64_MAC_STAT(tx_bad_bytes), 107 EFX_ETHTOOL_ULONG_MAC_STAT(tx_packets), 108 EFX_ETHTOOL_ULONG_MAC_STAT(tx_bad), 109 EFX_ETHTOOL_ULONG_MAC_STAT(tx_pause), 110 EFX_ETHTOOL_ULONG_MAC_STAT(tx_control), 111 EFX_ETHTOOL_ULONG_MAC_STAT(tx_unicast), 112 EFX_ETHTOOL_ULONG_MAC_STAT(tx_multicast), 113 EFX_ETHTOOL_ULONG_MAC_STAT(tx_broadcast), 114 EFX_ETHTOOL_ULONG_MAC_STAT(tx_lt64), 115 EFX_ETHTOOL_ULONG_MAC_STAT(tx_64), 116 EFX_ETHTOOL_ULONG_MAC_STAT(tx_65_to_127), 117 EFX_ETHTOOL_ULONG_MAC_STAT(tx_128_to_255), 118 EFX_ETHTOOL_ULONG_MAC_STAT(tx_256_to_511), 119 EFX_ETHTOOL_ULONG_MAC_STAT(tx_512_to_1023), 120 EFX_ETHTOOL_ULONG_MAC_STAT(tx_1024_to_15xx), 121 EFX_ETHTOOL_ULONG_MAC_STAT(tx_15xx_to_jumbo), 122 EFX_ETHTOOL_ULONG_MAC_STAT(tx_gtjumbo), 123 EFX_ETHTOOL_ULONG_MAC_STAT(tx_collision), 124 EFX_ETHTOOL_ULONG_MAC_STAT(tx_single_collision), 125 EFX_ETHTOOL_ULONG_MAC_STAT(tx_multiple_collision), 126 EFX_ETHTOOL_ULONG_MAC_STAT(tx_excessive_collision), 127 EFX_ETHTOOL_ULONG_MAC_STAT(tx_deferred), 128 EFX_ETHTOOL_ULONG_MAC_STAT(tx_late_collision), 129 EFX_ETHTOOL_ULONG_MAC_STAT(tx_excessive_deferred), 130 EFX_ETHTOOL_ULONG_MAC_STAT(tx_non_tcpudp), 131 EFX_ETHTOOL_ULONG_MAC_STAT(tx_mac_src_error), 132 EFX_ETHTOOL_ULONG_MAC_STAT(tx_ip_src_error), 133 EFX_ETHTOOL_U64_MAC_STAT(rx_bytes), 134 EFX_ETHTOOL_U64_MAC_STAT(rx_good_bytes), 135 EFX_ETHTOOL_U64_MAC_STAT(rx_bad_bytes), 136 EFX_ETHTOOL_ULONG_MAC_STAT(rx_packets), 137 EFX_ETHTOOL_ULONG_MAC_STAT(rx_good), 138 EFX_ETHTOOL_ULONG_MAC_STAT(rx_bad), 139 EFX_ETHTOOL_ULONG_MAC_STAT(rx_pause), 140 EFX_ETHTOOL_ULONG_MAC_STAT(rx_control), 141 EFX_ETHTOOL_ULONG_MAC_STAT(rx_unicast), 142 EFX_ETHTOOL_ULONG_MAC_STAT(rx_multicast), 143 EFX_ETHTOOL_ULONG_MAC_STAT(rx_broadcast), 144 EFX_ETHTOOL_ULONG_MAC_STAT(rx_lt64), 145 EFX_ETHTOOL_ULONG_MAC_STAT(rx_64), 146 EFX_ETHTOOL_ULONG_MAC_STAT(rx_65_to_127), 147 EFX_ETHTOOL_ULONG_MAC_STAT(rx_128_to_255), 148 EFX_ETHTOOL_ULONG_MAC_STAT(rx_256_to_511), 149 EFX_ETHTOOL_ULONG_MAC_STAT(rx_512_to_1023), 150 EFX_ETHTOOL_ULONG_MAC_STAT(rx_1024_to_15xx), 151 EFX_ETHTOOL_ULONG_MAC_STAT(rx_15xx_to_jumbo), 152 EFX_ETHTOOL_ULONG_MAC_STAT(rx_gtjumbo), 153 EFX_ETHTOOL_ULONG_MAC_STAT(rx_bad_lt64), 154 EFX_ETHTOOL_ULONG_MAC_STAT(rx_bad_64_to_15xx), 155 EFX_ETHTOOL_ULONG_MAC_STAT(rx_bad_15xx_to_jumbo), 156 EFX_ETHTOOL_ULONG_MAC_STAT(rx_bad_gtjumbo), 157 EFX_ETHTOOL_ULONG_MAC_STAT(rx_overflow), 158 EFX_ETHTOOL_ULONG_MAC_STAT(rx_missed), 159 EFX_ETHTOOL_ULONG_MAC_STAT(rx_false_carrier), 160 EFX_ETHTOOL_ULONG_MAC_STAT(rx_symbol_error), 161 EFX_ETHTOOL_ULONG_MAC_STAT(rx_align_error), 162 EFX_ETHTOOL_ULONG_MAC_STAT(rx_length_error), 163 EFX_ETHTOOL_ULONG_MAC_STAT(rx_internal_error), 164 EFX_ETHTOOL_UINT_NIC_STAT(rx_nodesc_drop_cnt), 165 EFX_ETHTOOL_ATOMIC_NIC_ERROR_STAT(rx_reset), 166 EFX_ETHTOOL_UINT_CHANNEL_STAT(rx_tobe_disc), 167 EFX_ETHTOOL_UINT_CHANNEL_STAT(rx_ip_hdr_chksum_err), 168 EFX_ETHTOOL_UINT_CHANNEL_STAT(rx_tcp_udp_chksum_err), 169 EFX_ETHTOOL_UINT_CHANNEL_STAT(rx_frm_trunc), 170}; 171 172/* Number of ethtool statistics */ 173#define EFX_ETHTOOL_NUM_STATS ARRAY_SIZE(efx_ethtool_stats) 174 175#define EFX_ETHTOOL_EEPROM_MAGIC 0xEFAB 176 177/************************************************************************** 178 * 179 * Ethtool operations 180 * 181 ************************************************************************** 182 */ 183 184/* Identify device by flashing LEDs */ 185static int efx_ethtool_phys_id(struct net_device *net_dev, u32 count) 186{ 187 struct efx_nic *efx = netdev_priv(net_dev); 188 189 efx->board_info.blink(efx, 1); 190 set_current_state(TASK_INTERRUPTIBLE); 191 if (count) 192 schedule_timeout(count * HZ); 193 else 194 schedule(); 195 efx->board_info.blink(efx, 0); 196 return 0; 197} 198 199/* This must be called with rtnl_lock held. */ 200int efx_ethtool_get_settings(struct net_device *net_dev, 201 struct ethtool_cmd *ecmd) 202{ 203 struct efx_nic *efx = netdev_priv(net_dev); 204 205 mutex_lock(&efx->mac_lock); 206 efx->phy_op->get_settings(efx, ecmd); 207 mutex_unlock(&efx->mac_lock); 208 209 /* Falcon GMAC does not support 1000Mbps HD */ 210 ecmd->supported &= ~SUPPORTED_1000baseT_Half; 211 212 return 0; 213} 214 215/* This must be called with rtnl_lock held. */ 216int efx_ethtool_set_settings(struct net_device *net_dev, 217 struct ethtool_cmd *ecmd) 218{ 219 struct efx_nic *efx = netdev_priv(net_dev); 220 int rc; 221 222 /* Falcon GMAC does not support 1000Mbps HD */ 223 if (ecmd->speed == SPEED_1000 && ecmd->duplex != DUPLEX_FULL) { 224 EFX_LOG(efx, "rejecting unsupported 1000Mbps HD" 225 " setting\n"); 226 return -EINVAL; 227 } 228 229 mutex_lock(&efx->mac_lock); 230 rc = efx->phy_op->set_settings(efx, ecmd); 231 mutex_unlock(&efx->mac_lock); 232 if (!rc) 233 efx_reconfigure_port(efx); 234 235 return rc; 236} 237 238static void efx_ethtool_get_drvinfo(struct net_device *net_dev, 239 struct ethtool_drvinfo *info) 240{ 241 struct efx_nic *efx = netdev_priv(net_dev); 242 243 strlcpy(info->driver, EFX_DRIVER_NAME, sizeof(info->driver)); 244 strlcpy(info->version, EFX_DRIVER_VERSION, sizeof(info->version)); 245 strlcpy(info->bus_info, pci_name(efx->pci_dev), sizeof(info->bus_info)); 246} 247 248/** 249 * efx_fill_test - fill in an individual self-test entry 250 * @test_index: Index of the test 251 * @strings: Ethtool strings, or %NULL 252 * @data: Ethtool test results, or %NULL 253 * @test: Pointer to test result (used only if data != %NULL) 254 * @unit_format: Unit name format (e.g. "chan\%d") 255 * @unit_id: Unit id (e.g. 0 for "chan0") 256 * @test_format: Test name format (e.g. "loopback.\%s.tx.sent") 257 * @test_id: Test id (e.g. "PHYXS" for "loopback.PHYXS.tx_sent") 258 * 259 * Fill in an individual self-test entry. 260 */ 261static void efx_fill_test(unsigned int test_index, 262 struct ethtool_string *strings, u64 *data, 263 int *test, const char *unit_format, int unit_id, 264 const char *test_format, const char *test_id) 265{ 266 struct ethtool_string unit_str, test_str; 267 268 /* Fill data value, if applicable */ 269 if (data) 270 data[test_index] = *test; 271 272 /* Fill string, if applicable */ 273 if (strings) { 274 if (strchr(unit_format, '%')) 275 snprintf(unit_str.name, sizeof(unit_str.name), 276 unit_format, unit_id); 277 else 278 strcpy(unit_str.name, unit_format); 279 snprintf(test_str.name, sizeof(test_str.name), 280 test_format, test_id); 281 snprintf(strings[test_index].name, 282 sizeof(strings[test_index].name), 283 "%-6s %-24s", unit_str.name, test_str.name); 284 } 285} 286 287#define EFX_CHANNEL_NAME(_channel) "chan%d", _channel->channel 288#define EFX_TX_QUEUE_NAME(_tx_queue) "txq%d", _tx_queue->queue 289#define EFX_RX_QUEUE_NAME(_rx_queue) "rxq%d", _rx_queue->queue 290#define EFX_LOOPBACK_NAME(_mode, _counter) \ 291 "loopback.%s." _counter, LOOPBACK_MODE_NAME(mode) 292 293/** 294 * efx_fill_loopback_test - fill in a block of loopback self-test entries 295 * @efx: Efx NIC 296 * @lb_tests: Efx loopback self-test results structure 297 * @mode: Loopback test mode 298 * @test_index: Starting index of the test 299 * @strings: Ethtool strings, or %NULL 300 * @data: Ethtool test results, or %NULL 301 */ 302static int efx_fill_loopback_test(struct efx_nic *efx, 303 struct efx_loopback_self_tests *lb_tests, 304 enum efx_loopback_mode mode, 305 unsigned int test_index, 306 struct ethtool_string *strings, u64 *data) 307{ 308 struct efx_tx_queue *tx_queue; 309 310 efx_for_each_tx_queue(tx_queue, efx) { 311 efx_fill_test(test_index++, strings, data, 312 &lb_tests->tx_sent[tx_queue->queue], 313 EFX_TX_QUEUE_NAME(tx_queue), 314 EFX_LOOPBACK_NAME(mode, "tx_sent")); 315 efx_fill_test(test_index++, strings, data, 316 &lb_tests->tx_done[tx_queue->queue], 317 EFX_TX_QUEUE_NAME(tx_queue), 318 EFX_LOOPBACK_NAME(mode, "tx_done")); 319 } 320 efx_fill_test(test_index++, strings, data, 321 &lb_tests->rx_good, 322 "rx", 0, 323 EFX_LOOPBACK_NAME(mode, "rx_good")); 324 efx_fill_test(test_index++, strings, data, 325 &lb_tests->rx_bad, 326 "rx", 0, 327 EFX_LOOPBACK_NAME(mode, "rx_bad")); 328 329 return test_index; 330} 331 332/** 333 * efx_ethtool_fill_self_tests - get self-test details 334 * @efx: Efx NIC 335 * @tests: Efx self-test results structure, or %NULL 336 * @strings: Ethtool strings, or %NULL 337 * @data: Ethtool test results, or %NULL 338 */ 339static int efx_ethtool_fill_self_tests(struct efx_nic *efx, 340 struct efx_self_tests *tests, 341 struct ethtool_string *strings, 342 u64 *data) 343{ 344 struct efx_channel *channel; 345 unsigned int n = 0, i; 346 enum efx_loopback_mode mode; 347 348 efx_fill_test(n++, strings, data, &tests->mii, 349 "core", 0, "mii", NULL); 350 efx_fill_test(n++, strings, data, &tests->nvram, 351 "core", 0, "nvram", NULL); 352 efx_fill_test(n++, strings, data, &tests->interrupt, 353 "core", 0, "interrupt", NULL); 354 355 /* Event queues */ 356 efx_for_each_channel(channel, efx) { 357 efx_fill_test(n++, strings, data, 358 &tests->eventq_dma[channel->channel], 359 EFX_CHANNEL_NAME(channel), 360 "eventq.dma", NULL); 361 efx_fill_test(n++, strings, data, 362 &tests->eventq_int[channel->channel], 363 EFX_CHANNEL_NAME(channel), 364 "eventq.int", NULL); 365 efx_fill_test(n++, strings, data, 366 &tests->eventq_poll[channel->channel], 367 EFX_CHANNEL_NAME(channel), 368 "eventq.poll", NULL); 369 } 370 371 efx_fill_test(n++, strings, data, &tests->registers, 372 "core", 0, "registers", NULL); 373 374 for (i = 0; i < efx->phy_op->num_tests; i++) 375 efx_fill_test(n++, strings, data, &tests->phy[i], 376 "phy", 0, efx->phy_op->test_names[i], NULL); 377 378 /* Loopback tests */ 379 for (mode = LOOPBACK_NONE; mode <= LOOPBACK_TEST_MAX; mode++) { 380 if (!(efx->loopback_modes & (1 << mode))) 381 continue; 382 n = efx_fill_loopback_test(efx, 383 &tests->loopback[mode], mode, n, 384 strings, data); 385 } 386 387 return n; 388} 389 390static int efx_ethtool_get_sset_count(struct net_device *net_dev, 391 int string_set) 392{ 393 switch (string_set) { 394 case ETH_SS_STATS: 395 return EFX_ETHTOOL_NUM_STATS; 396 case ETH_SS_TEST: 397 return efx_ethtool_fill_self_tests(netdev_priv(net_dev), 398 NULL, NULL, NULL); 399 default: 400 return -EINVAL; 401 } 402} 403 404static void efx_ethtool_get_strings(struct net_device *net_dev, 405 u32 string_set, u8 *strings) 406{ 407 struct efx_nic *efx = netdev_priv(net_dev); 408 struct ethtool_string *ethtool_strings = 409 (struct ethtool_string *)strings; 410 int i; 411 412 switch (string_set) { 413 case ETH_SS_STATS: 414 for (i = 0; i < EFX_ETHTOOL_NUM_STATS; i++) 415 strncpy(ethtool_strings[i].name, 416 efx_ethtool_stats[i].name, 417 sizeof(ethtool_strings[i].name)); 418 break; 419 case ETH_SS_TEST: 420 efx_ethtool_fill_self_tests(efx, NULL, 421 ethtool_strings, NULL); 422 break; 423 default: 424 /* No other string sets */ 425 break; 426 } 427} 428 429static void efx_ethtool_get_stats(struct net_device *net_dev, 430 struct ethtool_stats *stats, 431 u64 *data) 432{ 433 struct efx_nic *efx = netdev_priv(net_dev); 434 struct efx_mac_stats *mac_stats = &efx->mac_stats; 435 struct efx_ethtool_stat *stat; 436 struct efx_channel *channel; 437 int i; 438 439 EFX_BUG_ON_PARANOID(stats->n_stats != EFX_ETHTOOL_NUM_STATS); 440 441 /* Update MAC and NIC statistics */ 442 dev_get_stats(net_dev); 443 444 /* Fill detailed statistics buffer */ 445 for (i = 0; i < EFX_ETHTOOL_NUM_STATS; i++) { 446 stat = &efx_ethtool_stats[i]; 447 switch (stat->source) { 448 case EFX_ETHTOOL_STAT_SOURCE_mac_stats: 449 data[i] = stat->get_stat((void *)mac_stats + 450 stat->offset); 451 break; 452 case EFX_ETHTOOL_STAT_SOURCE_nic: 453 data[i] = stat->get_stat((void *)efx + stat->offset); 454 break; 455 case EFX_ETHTOOL_STAT_SOURCE_channel: 456 data[i] = 0; 457 efx_for_each_channel(channel, efx) 458 data[i] += stat->get_stat((void *)channel + 459 stat->offset); 460 break; 461 } 462 } 463} 464 465static int efx_ethtool_set_rx_csum(struct net_device *net_dev, u32 enable) 466{ 467 struct efx_nic *efx = netdev_priv(net_dev); 468 469 /* No way to stop the hardware doing the checks; we just 470 * ignore the result. 471 */ 472 efx->rx_checksum_enabled = !!enable; 473 474 return 0; 475} 476 477static u32 efx_ethtool_get_rx_csum(struct net_device *net_dev) 478{ 479 struct efx_nic *efx = netdev_priv(net_dev); 480 481 return efx->rx_checksum_enabled; 482} 483 484static void efx_ethtool_self_test(struct net_device *net_dev, 485 struct ethtool_test *test, u64 *data) 486{ 487 struct efx_nic *efx = netdev_priv(net_dev); 488 struct efx_self_tests efx_tests; 489 int already_up; 490 int rc; 491 492 ASSERT_RTNL(); 493 if (efx->state != STATE_RUNNING) { 494 rc = -EIO; 495 goto fail1; 496 } 497 498 /* We need rx buffers and interrupts. */ 499 already_up = (efx->net_dev->flags & IFF_UP); 500 if (!already_up) { 501 rc = dev_open(efx->net_dev); 502 if (rc) { 503 EFX_ERR(efx, "failed opening device.\n"); 504 goto fail2; 505 } 506 } 507 508 memset(&efx_tests, 0, sizeof(efx_tests)); 509 510 rc = efx_selftest(efx, &efx_tests, test->flags); 511 512 if (!already_up) 513 dev_close(efx->net_dev); 514 515 EFX_LOG(efx, "%s %sline self-tests\n", 516 rc == 0 ? "passed" : "failed", 517 (test->flags & ETH_TEST_FL_OFFLINE) ? "off" : "on"); 518 519 fail2: 520 fail1: 521 /* Fill ethtool results structures */ 522 efx_ethtool_fill_self_tests(efx, &efx_tests, NULL, data); 523 if (rc) 524 test->flags |= ETH_TEST_FL_FAILED; 525} 526 527/* Restart autonegotiation */ 528static int efx_ethtool_nway_reset(struct net_device *net_dev) 529{ 530 struct efx_nic *efx = netdev_priv(net_dev); 531 532 return mii_nway_restart(&efx->mii); 533} 534 535static u32 efx_ethtool_get_link(struct net_device *net_dev) 536{ 537 struct efx_nic *efx = netdev_priv(net_dev); 538 539 return efx->link_up; 540} 541 542static int efx_ethtool_get_eeprom_len(struct net_device *net_dev) 543{ 544 struct efx_nic *efx = netdev_priv(net_dev); 545 struct efx_spi_device *spi = efx->spi_eeprom; 546 547 if (!spi) 548 return 0; 549 return min(spi->size, EFX_EEPROM_BOOTCONFIG_END) - 550 min(spi->size, EFX_EEPROM_BOOTCONFIG_START); 551} 552 553static int efx_ethtool_get_eeprom(struct net_device *net_dev, 554 struct ethtool_eeprom *eeprom, u8 *buf) 555{ 556 struct efx_nic *efx = netdev_priv(net_dev); 557 struct efx_spi_device *spi = efx->spi_eeprom; 558 size_t len; 559 int rc; 560 561 rc = mutex_lock_interruptible(&efx->spi_lock); 562 if (rc) 563 return rc; 564 rc = falcon_spi_read(spi, eeprom->offset + EFX_EEPROM_BOOTCONFIG_START, 565 eeprom->len, &len, buf); 566 mutex_unlock(&efx->spi_lock); 567 568 eeprom->magic = EFX_ETHTOOL_EEPROM_MAGIC; 569 eeprom->len = len; 570 return rc; 571} 572 573static int efx_ethtool_set_eeprom(struct net_device *net_dev, 574 struct ethtool_eeprom *eeprom, u8 *buf) 575{ 576 struct efx_nic *efx = netdev_priv(net_dev); 577 struct efx_spi_device *spi = efx->spi_eeprom; 578 size_t len; 579 int rc; 580 581 if (eeprom->magic != EFX_ETHTOOL_EEPROM_MAGIC) 582 return -EINVAL; 583 584 rc = mutex_lock_interruptible(&efx->spi_lock); 585 if (rc) 586 return rc; 587 rc = falcon_spi_write(spi, eeprom->offset + EFX_EEPROM_BOOTCONFIG_START, 588 eeprom->len, &len, buf); 589 mutex_unlock(&efx->spi_lock); 590 591 eeprom->len = len; 592 return rc; 593} 594 595static int efx_ethtool_get_coalesce(struct net_device *net_dev, 596 struct ethtool_coalesce *coalesce) 597{ 598 struct efx_nic *efx = netdev_priv(net_dev); 599 struct efx_tx_queue *tx_queue; 600 struct efx_rx_queue *rx_queue; 601 struct efx_channel *channel; 602 603 memset(coalesce, 0, sizeof(*coalesce)); 604 605 /* Find lowest IRQ moderation across all used TX queues */ 606 coalesce->tx_coalesce_usecs_irq = ~((u32) 0); 607 efx_for_each_tx_queue(tx_queue, efx) { 608 channel = tx_queue->channel; 609 if (channel->irq_moderation < coalesce->tx_coalesce_usecs_irq) { 610 if (channel->used_flags != EFX_USED_BY_RX_TX) 611 coalesce->tx_coalesce_usecs_irq = 612 channel->irq_moderation; 613 else 614 coalesce->tx_coalesce_usecs_irq = 0; 615 } 616 } 617 618 /* Find lowest IRQ moderation across all used RX queues */ 619 coalesce->rx_coalesce_usecs_irq = ~((u32) 0); 620 efx_for_each_rx_queue(rx_queue, efx) { 621 channel = rx_queue->channel; 622 if (channel->irq_moderation < coalesce->rx_coalesce_usecs_irq) 623 coalesce->rx_coalesce_usecs_irq = 624 channel->irq_moderation; 625 } 626 627 return 0; 628} 629 630/* Set coalescing parameters 631 * The difficulties occur for shared channels 632 */ 633static int efx_ethtool_set_coalesce(struct net_device *net_dev, 634 struct ethtool_coalesce *coalesce) 635{ 636 struct efx_nic *efx = netdev_priv(net_dev); 637 struct efx_channel *channel; 638 struct efx_tx_queue *tx_queue; 639 unsigned tx_usecs, rx_usecs; 640 641 if (coalesce->use_adaptive_rx_coalesce || 642 coalesce->use_adaptive_tx_coalesce) 643 return -EOPNOTSUPP; 644 645 if (coalesce->rx_coalesce_usecs || coalesce->tx_coalesce_usecs) { 646 EFX_ERR(efx, "invalid coalescing setting. " 647 "Only rx/tx_coalesce_usecs_irq are supported\n"); 648 return -EOPNOTSUPP; 649 } 650 651 rx_usecs = coalesce->rx_coalesce_usecs_irq; 652 tx_usecs = coalesce->tx_coalesce_usecs_irq; 653 654 /* If the channel is shared only allow RX parameters to be set */ 655 efx_for_each_tx_queue(tx_queue, efx) { 656 if ((tx_queue->channel->used_flags == EFX_USED_BY_RX_TX) && 657 tx_usecs) { 658 EFX_ERR(efx, "Channel is shared. " 659 "Only RX coalescing may be set\n"); 660 return -EOPNOTSUPP; 661 } 662 } 663 664 efx_init_irq_moderation(efx, tx_usecs, rx_usecs); 665 666 /* Reset channel to pick up new moderation value. Note that 667 * this may change the value of the irq_moderation field 668 * (e.g. to allow for hardware timer granularity). 669 */ 670 efx_for_each_channel(channel, efx) 671 falcon_set_int_moderation(channel); 672 673 return 0; 674} 675 676static int efx_ethtool_set_pauseparam(struct net_device *net_dev, 677 struct ethtool_pauseparam *pause) 678{ 679 struct efx_nic *efx = netdev_priv(net_dev); 680 enum efx_fc_type wanted_fc; 681 bool reset; 682 683 wanted_fc = ((pause->rx_pause ? EFX_FC_RX : 0) | 684 (pause->tx_pause ? EFX_FC_TX : 0) | 685 (pause->autoneg ? EFX_FC_AUTO : 0)); 686 687 if ((wanted_fc & EFX_FC_TX) && !(wanted_fc & EFX_FC_RX)) { 688 EFX_LOG(efx, "Flow control unsupported: tx ON rx OFF\n"); 689 return -EINVAL; 690 } 691 692 if (!(efx->phy_op->mmds & DEV_PRESENT_BIT(MDIO_MMD_AN)) && 693 (wanted_fc & EFX_FC_AUTO)) { 694 EFX_LOG(efx, "PHY does not support flow control " 695 "autonegotiation\n"); 696 return -EINVAL; 697 } 698 699 /* TX flow control may automatically turn itself off if the 700 * link partner (intermittently) stops responding to pause 701 * frames. There isn't any indication that this has happened, 702 * so the best we do is leave it up to the user to spot this 703 * and fix it be cycling transmit flow control on this end. */ 704 reset = (wanted_fc & EFX_FC_TX) && !(efx->wanted_fc & EFX_FC_TX); 705 if (EFX_WORKAROUND_11482(efx) && reset) { 706 if (falcon_rev(efx) >= FALCON_REV_B0) { 707 /* Recover by resetting the EM block */ 708 if (efx->link_up) 709 falcon_drain_tx_fifo(efx); 710 } else { 711 /* Schedule a reset to recover */ 712 efx_schedule_reset(efx, RESET_TYPE_INVISIBLE); 713 } 714 } 715 716 /* Try to push the pause parameters */ 717 mutex_lock(&efx->mac_lock); 718 719 efx->wanted_fc = wanted_fc; 720 mdio_clause45_set_pause(efx); 721 __efx_reconfigure_port(efx); 722 723 mutex_unlock(&efx->mac_lock); 724 725 return 0; 726} 727 728static void efx_ethtool_get_pauseparam(struct net_device *net_dev, 729 struct ethtool_pauseparam *pause) 730{ 731 struct efx_nic *efx = netdev_priv(net_dev); 732 733 pause->rx_pause = !!(efx->wanted_fc & EFX_FC_RX); 734 pause->tx_pause = !!(efx->wanted_fc & EFX_FC_TX); 735 pause->autoneg = !!(efx->wanted_fc & EFX_FC_AUTO); 736} 737 738 739struct ethtool_ops efx_ethtool_ops = { 740 .get_settings = efx_ethtool_get_settings, 741 .set_settings = efx_ethtool_set_settings, 742 .get_drvinfo = efx_ethtool_get_drvinfo, 743 .nway_reset = efx_ethtool_nway_reset, 744 .get_link = efx_ethtool_get_link, 745 .get_eeprom_len = efx_ethtool_get_eeprom_len, 746 .get_eeprom = efx_ethtool_get_eeprom, 747 .set_eeprom = efx_ethtool_set_eeprom, 748 .get_coalesce = efx_ethtool_get_coalesce, 749 .set_coalesce = efx_ethtool_set_coalesce, 750 .get_pauseparam = efx_ethtool_get_pauseparam, 751 .set_pauseparam = efx_ethtool_set_pauseparam, 752 .get_rx_csum = efx_ethtool_get_rx_csum, 753 .set_rx_csum = efx_ethtool_set_rx_csum, 754 .get_tx_csum = ethtool_op_get_tx_csum, 755 .set_tx_csum = ethtool_op_set_tx_csum, 756 .get_sg = ethtool_op_get_sg, 757 .set_sg = ethtool_op_set_sg, 758 .get_tso = ethtool_op_get_tso, 759 .set_tso = ethtool_op_set_tso, 760 .get_flags = ethtool_op_get_flags, 761 .set_flags = ethtool_op_set_flags, 762 .get_sset_count = efx_ethtool_get_sset_count, 763 .self_test = efx_ethtool_self_test, 764 .get_strings = efx_ethtool_get_strings, 765 .phys_id = efx_ethtool_phys_id, 766 .get_ethtool_stats = efx_ethtool_get_stats, 767};