aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/benet/be_ethtool.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/benet/be_ethtool.c')
-rw-r--r--drivers/net/benet/be_ethtool.c77
1 files changed, 53 insertions, 24 deletions
diff --git a/drivers/net/benet/be_ethtool.c b/drivers/net/benet/be_ethtool.c
index b4be0271efe..6e5e43380c2 100644
--- a/drivers/net/benet/be_ethtool.c
+++ b/drivers/net/benet/be_ethtool.c
@@ -26,7 +26,8 @@ struct be_ethtool_stat {
26 int offset; 26 int offset;
27}; 27};
28 28
29enum {NETSTAT, PORTSTAT, MISCSTAT, DRVSTAT_TX, DRVSTAT_RX, ERXSTAT}; 29enum {NETSTAT, PORTSTAT, MISCSTAT, DRVSTAT_TX, DRVSTAT_RX, ERXSTAT,
30 PMEMSTAT, DRVSTAT};
30#define FIELDINFO(_struct, field) FIELD_SIZEOF(_struct, field), \ 31#define FIELDINFO(_struct, field) FIELD_SIZEOF(_struct, field), \
31 offsetof(_struct, field) 32 offsetof(_struct, field)
32#define NETSTAT_INFO(field) #field, NETSTAT,\ 33#define NETSTAT_INFO(field) #field, NETSTAT,\
@@ -43,6 +44,11 @@ enum {NETSTAT, PORTSTAT, MISCSTAT, DRVSTAT_TX, DRVSTAT_RX, ERXSTAT};
43 field) 44 field)
44#define ERXSTAT_INFO(field) #field, ERXSTAT,\ 45#define ERXSTAT_INFO(field) #field, ERXSTAT,\
45 FIELDINFO(struct be_erx_stats, field) 46 FIELDINFO(struct be_erx_stats, field)
47#define PMEMSTAT_INFO(field) #field, PMEMSTAT,\
48 FIELDINFO(struct be_pmem_stats, field)
49#define DRVSTAT_INFO(field) #field, DRVSTAT,\
50 FIELDINFO(struct be_drv_stats, \
51 field)
46 52
47static const struct be_ethtool_stat et_stats[] = { 53static const struct be_ethtool_stat et_stats[] = {
48 {NETSTAT_INFO(rx_packets)}, 54 {NETSTAT_INFO(rx_packets)},
@@ -99,7 +105,11 @@ static const struct be_ethtool_stat et_stats[] = {
99 {MISCSTAT_INFO(rx_drops_too_many_frags)}, 105 {MISCSTAT_INFO(rx_drops_too_many_frags)},
100 {MISCSTAT_INFO(rx_drops_invalid_ring)}, 106 {MISCSTAT_INFO(rx_drops_invalid_ring)},
101 {MISCSTAT_INFO(forwarded_packets)}, 107 {MISCSTAT_INFO(forwarded_packets)},
102 {MISCSTAT_INFO(rx_drops_mtu)} 108 {MISCSTAT_INFO(rx_drops_mtu)},
109 {MISCSTAT_INFO(port0_jabber_events)},
110 {MISCSTAT_INFO(port1_jabber_events)},
111 {PMEMSTAT_INFO(eth_red_drops)},
112 {DRVSTAT_INFO(be_on_die_temperature)}
103}; 113};
104#define ETHTOOL_STATS_NUM ARRAY_SIZE(et_stats) 114#define ETHTOOL_STATS_NUM ARRAY_SIZE(et_stats)
105 115
@@ -121,7 +131,7 @@ static const char et_self_tests[][ETH_GSTRING_LEN] = {
121 "MAC Loopback test", 131 "MAC Loopback test",
122 "PHY Loopback test", 132 "PHY Loopback test",
123 "External Loopback test", 133 "External Loopback test",
124 "DDR DMA test" 134 "DDR DMA test",
125 "Link test" 135 "Link test"
126}; 136};
127 137
@@ -276,6 +286,12 @@ be_get_ethtool_stats(struct net_device *netdev,
276 case MISCSTAT: 286 case MISCSTAT:
277 p = &hw_stats->rxf; 287 p = &hw_stats->rxf;
278 break; 288 break;
289 case PMEMSTAT:
290 p = &hw_stats->pmem;
291 break;
292 case DRVSTAT:
293 p = &adapter->drv_stats;
294 break;
279 } 295 }
280 296
281 p = (u8 *)p + et_stats[i].offset; 297 p = (u8 *)p + et_stats[i].offset;
@@ -376,8 +392,9 @@ static int be_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd)
376 } 392 }
377 393
378 phy_cmd.size = sizeof(struct be_cmd_req_get_phy_info); 394 phy_cmd.size = sizeof(struct be_cmd_req_get_phy_info);
379 phy_cmd.va = pci_alloc_consistent(adapter->pdev, phy_cmd.size, 395 phy_cmd.va = dma_alloc_coherent(&adapter->pdev->dev,
380 &phy_cmd.dma); 396 phy_cmd.size, &phy_cmd.dma,
397 GFP_KERNEL);
381 if (!phy_cmd.va) { 398 if (!phy_cmd.va) {
382 dev_err(&adapter->pdev->dev, "Memory alloc failure\n"); 399 dev_err(&adapter->pdev->dev, "Memory alloc failure\n");
383 return -ENOMEM; 400 return -ENOMEM;
@@ -416,8 +433,8 @@ static int be_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd)
416 adapter->port_type = ecmd->port; 433 adapter->port_type = ecmd->port;
417 adapter->transceiver = ecmd->transceiver; 434 adapter->transceiver = ecmd->transceiver;
418 adapter->autoneg = ecmd->autoneg; 435 adapter->autoneg = ecmd->autoneg;
419 pci_free_consistent(adapter->pdev, phy_cmd.size, 436 dma_free_coherent(&adapter->pdev->dev, phy_cmd.size, phy_cmd.va,
420 phy_cmd.va, phy_cmd.dma); 437 phy_cmd.dma);
421 } else { 438 } else {
422 ecmd->speed = adapter->link_speed; 439 ecmd->speed = adapter->link_speed;
423 ecmd->port = adapter->port_type; 440 ecmd->port = adapter->port_type;
@@ -496,7 +513,7 @@ be_phys_id(struct net_device *netdev, u32 data)
496 int status; 513 int status;
497 u32 cur; 514 u32 cur;
498 515
499 be_cmd_get_beacon_state(adapter, adapter->port_num, &cur); 516 be_cmd_get_beacon_state(adapter, adapter->hba_port_num, &cur);
500 517
501 if (cur == BEACON_STATE_ENABLED) 518 if (cur == BEACON_STATE_ENABLED)
502 return 0; 519 return 0;
@@ -504,23 +521,34 @@ be_phys_id(struct net_device *netdev, u32 data)
504 if (data < 2) 521 if (data < 2)
505 data = 2; 522 data = 2;
506 523
507 status = be_cmd_set_beacon_state(adapter, adapter->port_num, 0, 0, 524 status = be_cmd_set_beacon_state(adapter, adapter->hba_port_num, 0, 0,
508 BEACON_STATE_ENABLED); 525 BEACON_STATE_ENABLED);
509 set_current_state(TASK_INTERRUPTIBLE); 526 set_current_state(TASK_INTERRUPTIBLE);
510 schedule_timeout(data*HZ); 527 schedule_timeout(data*HZ);
511 528
512 status = be_cmd_set_beacon_state(adapter, adapter->port_num, 0, 0, 529 status = be_cmd_set_beacon_state(adapter, adapter->hba_port_num, 0, 0,
513 BEACON_STATE_DISABLED); 530 BEACON_STATE_DISABLED);
514 531
515 return status; 532 return status;
516} 533}
517 534
535static bool
536be_is_wol_supported(struct be_adapter *adapter)
537{
538 if (!be_physfn(adapter))
539 return false;
540 else
541 return true;
542}
543
518static void 544static void
519be_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol) 545be_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
520{ 546{
521 struct be_adapter *adapter = netdev_priv(netdev); 547 struct be_adapter *adapter = netdev_priv(netdev);
522 548
523 wol->supported = WAKE_MAGIC; 549 if (be_is_wol_supported(adapter))
550 wol->supported = WAKE_MAGIC;
551
524 if (adapter->wol) 552 if (adapter->wol)
525 wol->wolopts = WAKE_MAGIC; 553 wol->wolopts = WAKE_MAGIC;
526 else 554 else
@@ -536,7 +564,7 @@ be_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
536 if (wol->wolopts & ~WAKE_MAGIC) 564 if (wol->wolopts & ~WAKE_MAGIC)
537 return -EINVAL; 565 return -EINVAL;
538 566
539 if (wol->wolopts & WAKE_MAGIC) 567 if ((wol->wolopts & WAKE_MAGIC) && be_is_wol_supported(adapter))
540 adapter->wol = true; 568 adapter->wol = true;
541 else 569 else
542 adapter->wol = false; 570 adapter->wol = false;
@@ -554,8 +582,8 @@ be_test_ddr_dma(struct be_adapter *adapter)
554 }; 582 };
555 583
556 ddrdma_cmd.size = sizeof(struct be_cmd_req_ddrdma_test); 584 ddrdma_cmd.size = sizeof(struct be_cmd_req_ddrdma_test);
557 ddrdma_cmd.va = pci_alloc_consistent(adapter->pdev, ddrdma_cmd.size, 585 ddrdma_cmd.va = dma_alloc_coherent(&adapter->pdev->dev, ddrdma_cmd.size,
558 &ddrdma_cmd.dma); 586 &ddrdma_cmd.dma, GFP_KERNEL);
559 if (!ddrdma_cmd.va) { 587 if (!ddrdma_cmd.va) {
560 dev_err(&adapter->pdev->dev, "Memory allocation failure\n"); 588 dev_err(&adapter->pdev->dev, "Memory allocation failure\n");
561 return -ENOMEM; 589 return -ENOMEM;
@@ -569,20 +597,20 @@ be_test_ddr_dma(struct be_adapter *adapter)
569 } 597 }
570 598
571err: 599err:
572 pci_free_consistent(adapter->pdev, ddrdma_cmd.size, 600 dma_free_coherent(&adapter->pdev->dev, ddrdma_cmd.size, ddrdma_cmd.va,
573 ddrdma_cmd.va, ddrdma_cmd.dma); 601 ddrdma_cmd.dma);
574 return ret; 602 return ret;
575} 603}
576 604
577static u64 be_loopback_test(struct be_adapter *adapter, u8 loopback_type, 605static u64 be_loopback_test(struct be_adapter *adapter, u8 loopback_type,
578 u64 *status) 606 u64 *status)
579{ 607{
580 be_cmd_set_loopback(adapter, adapter->port_num, 608 be_cmd_set_loopback(adapter, adapter->hba_port_num,
581 loopback_type, 1); 609 loopback_type, 1);
582 *status = be_cmd_loopback_test(adapter, adapter->port_num, 610 *status = be_cmd_loopback_test(adapter, adapter->hba_port_num,
583 loopback_type, 1500, 611 loopback_type, 1500,
584 2, 0xabc); 612 2, 0xabc);
585 be_cmd_set_loopback(adapter, adapter->port_num, 613 be_cmd_set_loopback(adapter, adapter->hba_port_num,
586 BE_NO_LOOPBACK, 1); 614 BE_NO_LOOPBACK, 1);
587 return *status; 615 return *status;
588} 616}
@@ -621,7 +649,8 @@ be_self_test(struct net_device *netdev, struct ethtool_test *test, u64 *data)
621 &qos_link_speed) != 0) { 649 &qos_link_speed) != 0) {
622 test->flags |= ETH_TEST_FL_FAILED; 650 test->flags |= ETH_TEST_FL_FAILED;
623 data[4] = -1; 651 data[4] = -1;
624 } else if (mac_speed) { 652 } else if (!mac_speed) {
653 test->flags |= ETH_TEST_FL_FAILED;
625 data[4] = 1; 654 data[4] = 1;
626 } 655 }
627} 656}
@@ -662,8 +691,8 @@ be_read_eeprom(struct net_device *netdev, struct ethtool_eeprom *eeprom,
662 691
663 memset(&eeprom_cmd, 0, sizeof(struct be_dma_mem)); 692 memset(&eeprom_cmd, 0, sizeof(struct be_dma_mem));
664 eeprom_cmd.size = sizeof(struct be_cmd_req_seeprom_read); 693 eeprom_cmd.size = sizeof(struct be_cmd_req_seeprom_read);
665 eeprom_cmd.va = pci_alloc_consistent(adapter->pdev, eeprom_cmd.size, 694 eeprom_cmd.va = dma_alloc_coherent(&adapter->pdev->dev, eeprom_cmd.size,
666 &eeprom_cmd.dma); 695 &eeprom_cmd.dma, GFP_KERNEL);
667 696
668 if (!eeprom_cmd.va) { 697 if (!eeprom_cmd.va) {
669 dev_err(&adapter->pdev->dev, 698 dev_err(&adapter->pdev->dev,
@@ -677,8 +706,8 @@ be_read_eeprom(struct net_device *netdev, struct ethtool_eeprom *eeprom,
677 resp = (struct be_cmd_resp_seeprom_read *) eeprom_cmd.va; 706 resp = (struct be_cmd_resp_seeprom_read *) eeprom_cmd.va;
678 memcpy(data, resp->seeprom_data + eeprom->offset, eeprom->len); 707 memcpy(data, resp->seeprom_data + eeprom->offset, eeprom->len);
679 } 708 }
680 pci_free_consistent(adapter->pdev, eeprom_cmd.size, eeprom_cmd.va, 709 dma_free_coherent(&adapter->pdev->dev, eeprom_cmd.size, eeprom_cmd.va,
681 eeprom_cmd.dma); 710 eeprom_cmd.dma);
682 711
683 return status; 712 return status;
684} 713}