diff options
Diffstat (limited to 'drivers/net/benet/be_ethtool.c')
-rw-r--r-- | drivers/net/benet/be_ethtool.c | 77 |
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 | ||
29 | enum {NETSTAT, PORTSTAT, MISCSTAT, DRVSTAT_TX, DRVSTAT_RX, ERXSTAT}; | 29 | enum {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 | ||
47 | static const struct be_ethtool_stat et_stats[] = { | 53 | static 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 | ||
535 | static bool | ||
536 | be_is_wol_supported(struct be_adapter *adapter) | ||
537 | { | ||
538 | if (!be_physfn(adapter)) | ||
539 | return false; | ||
540 | else | ||
541 | return true; | ||
542 | } | ||
543 | |||
518 | static void | 544 | static void |
519 | be_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol) | 545 | be_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 | ||
571 | err: | 599 | err: |
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 | ||
577 | static u64 be_loopback_test(struct be_adapter *adapter, u8 loopback_type, | 605 | static 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 | } |