aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/qlge/qlge_ethtool.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/qlge/qlge_ethtool.c')
-rw-r--r--drivers/net/qlge/qlge_ethtool.c93
1 files changed, 36 insertions, 57 deletions
diff --git a/drivers/net/qlge/qlge_ethtool.c b/drivers/net/qlge/qlge_ethtool.c
index 4892d64f4e05..19b00fa0eaf0 100644
--- a/drivers/net/qlge/qlge_ethtool.c
+++ b/drivers/net/qlge/qlge_ethtool.c
@@ -356,7 +356,7 @@ static int ql_get_settings(struct net_device *ndev,
356 ecmd->port = PORT_FIBRE; 356 ecmd->port = PORT_FIBRE;
357 } 357 }
358 358
359 ecmd->speed = SPEED_10000; 359 ethtool_cmd_speed_set(ecmd, SPEED_10000);
360 ecmd->duplex = DUPLEX_FULL; 360 ecmd->duplex = DUPLEX_FULL;
361 361
362 return 0; 362 return 0;
@@ -375,7 +375,10 @@ static void ql_get_drvinfo(struct net_device *ndev,
375 strncpy(drvinfo->bus_info, pci_name(qdev->pdev), 32); 375 strncpy(drvinfo->bus_info, pci_name(qdev->pdev), 32);
376 drvinfo->n_stats = 0; 376 drvinfo->n_stats = 0;
377 drvinfo->testinfo_len = 0; 377 drvinfo->testinfo_len = 0;
378 drvinfo->regdump_len = 0; 378 if (!test_bit(QL_FRC_COREDUMP, &qdev->flags))
379 drvinfo->regdump_len = sizeof(struct ql_mpi_coredump);
380 else
381 drvinfo->regdump_len = sizeof(struct ql_reg_dump);
379 drvinfo->eedump_len = 0; 382 drvinfo->eedump_len = 0;
380} 383}
381 384
@@ -409,31 +412,31 @@ static int ql_set_wol(struct net_device *ndev, struct ethtool_wolinfo *wol)
409 return 0; 412 return 0;
410} 413}
411 414
412static int ql_phys_id(struct net_device *ndev, u32 data) 415static int ql_set_phys_id(struct net_device *ndev,
416 enum ethtool_phys_id_state state)
417
413{ 418{
414 struct ql_adapter *qdev = netdev_priv(ndev); 419 struct ql_adapter *qdev = netdev_priv(ndev);
415 u32 led_reg, i;
416 int status;
417 420
418 /* Save the current LED settings */ 421 switch (state) {
419 status = ql_mb_get_led_cfg(qdev); 422 case ETHTOOL_ID_ACTIVE:
420 if (status) 423 /* Save the current LED settings */
421 return status; 424 if (ql_mb_get_led_cfg(qdev))
422 led_reg = qdev->led_config; 425 return -EIO;
423 426
424 /* Start blinking the led */ 427 /* Start blinking */
425 if (!data || data > 300)
426 data = 300;
427
428 for (i = 0; i < (data * 10); i++)
429 ql_mb_set_led_cfg(qdev, QL_LED_BLINK); 428 ql_mb_set_led_cfg(qdev, QL_LED_BLINK);
429 return 0;
430 430
431 /* Restore LED settings */ 431 case ETHTOOL_ID_INACTIVE:
432 status = ql_mb_set_led_cfg(qdev, led_reg); 432 /* Restore LED settings */
433 if (status) 433 if (ql_mb_set_led_cfg(qdev, qdev->led_config))
434 return status; 434 return -EIO;
435 return 0;
435 436
436 return 0; 437 default:
438 return -EINVAL;
439 }
437} 440}
438 441
439static int ql_start_loopback(struct ql_adapter *qdev) 442static int ql_start_loopback(struct ql_adapter *qdev)
@@ -547,7 +550,12 @@ static void ql_self_test(struct net_device *ndev,
547 550
548static int ql_get_regs_len(struct net_device *ndev) 551static int ql_get_regs_len(struct net_device *ndev)
549{ 552{
550 return sizeof(struct ql_reg_dump); 553 struct ql_adapter *qdev = netdev_priv(ndev);
554
555 if (!test_bit(QL_FRC_COREDUMP, &qdev->flags))
556 return sizeof(struct ql_mpi_coredump);
557 else
558 return sizeof(struct ql_reg_dump);
551} 559}
552 560
553static void ql_get_regs(struct net_device *ndev, 561static void ql_get_regs(struct net_device *ndev,
@@ -555,7 +563,12 @@ static void ql_get_regs(struct net_device *ndev,
555{ 563{
556 struct ql_adapter *qdev = netdev_priv(ndev); 564 struct ql_adapter *qdev = netdev_priv(ndev);
557 565
558 ql_gen_reg_dump(qdev, p); 566 ql_get_dump(qdev, p);
567 qdev->core_is_dumped = 0;
568 if (!test_bit(QL_FRC_COREDUMP, &qdev->flags))
569 regs->len = sizeof(struct ql_mpi_coredump);
570 else
571 regs->len = sizeof(struct ql_reg_dump);
559} 572}
560 573
561static int ql_get_coalesce(struct net_device *dev, struct ethtool_coalesce *c) 574static int ql_get_coalesce(struct net_device *dev, struct ethtool_coalesce *c)
@@ -642,32 +655,6 @@ static int ql_set_pauseparam(struct net_device *netdev,
642 return status; 655 return status;
643} 656}
644 657
645static u32 ql_get_rx_csum(struct net_device *netdev)
646{
647 struct ql_adapter *qdev = netdev_priv(netdev);
648 return qdev->rx_csum;
649}
650
651static int ql_set_rx_csum(struct net_device *netdev, uint32_t data)
652{
653 struct ql_adapter *qdev = netdev_priv(netdev);
654 qdev->rx_csum = data;
655 return 0;
656}
657
658static int ql_set_tso(struct net_device *ndev, uint32_t data)
659{
660
661 if (data) {
662 ndev->features |= NETIF_F_TSO;
663 ndev->features |= NETIF_F_TSO6;
664 } else {
665 ndev->features &= ~NETIF_F_TSO;
666 ndev->features &= ~NETIF_F_TSO6;
667 }
668 return 0;
669}
670
671static u32 ql_get_msglevel(struct net_device *ndev) 658static u32 ql_get_msglevel(struct net_device *ndev)
672{ 659{
673 struct ql_adapter *qdev = netdev_priv(ndev); 660 struct ql_adapter *qdev = netdev_priv(ndev);
@@ -690,18 +677,10 @@ const struct ethtool_ops qlge_ethtool_ops = {
690 .get_msglevel = ql_get_msglevel, 677 .get_msglevel = ql_get_msglevel,
691 .set_msglevel = ql_set_msglevel, 678 .set_msglevel = ql_set_msglevel,
692 .get_link = ethtool_op_get_link, 679 .get_link = ethtool_op_get_link,
693 .phys_id = ql_phys_id, 680 .set_phys_id = ql_set_phys_id,
694 .self_test = ql_self_test, 681 .self_test = ql_self_test,
695 .get_pauseparam = ql_get_pauseparam, 682 .get_pauseparam = ql_get_pauseparam,
696 .set_pauseparam = ql_set_pauseparam, 683 .set_pauseparam = ql_set_pauseparam,
697 .get_rx_csum = ql_get_rx_csum,
698 .set_rx_csum = ql_set_rx_csum,
699 .get_tx_csum = ethtool_op_get_tx_csum,
700 .set_tx_csum = ethtool_op_set_tx_csum,
701 .get_sg = ethtool_op_get_sg,
702 .set_sg = ethtool_op_set_sg,
703 .get_tso = ethtool_op_get_tso,
704 .set_tso = ql_set_tso,
705 .get_coalesce = ql_get_coalesce, 684 .get_coalesce = ql_get_coalesce,
706 .set_coalesce = ql_set_coalesce, 685 .set_coalesce = ql_set_coalesce,
707 .get_sset_count = ql_get_sset_count, 686 .get_sset_count = ql_get_sset_count,