diff options
Diffstat (limited to 'drivers/net/ixgbe/ixgbe_main.c')
-rw-r--r-- | drivers/net/ixgbe/ixgbe_main.c | 121 |
1 files changed, 96 insertions, 25 deletions
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c index 9ef128ae6458..07e778d3e5d2 100644 --- a/drivers/net/ixgbe/ixgbe_main.c +++ b/drivers/net/ixgbe/ixgbe_main.c | |||
@@ -2723,17 +2723,21 @@ static inline bool ixgbe_set_rss_queues(struct ixgbe_adapter *adapter) | |||
2723 | **/ | 2723 | **/ |
2724 | static void ixgbe_set_num_queues(struct ixgbe_adapter *adapter) | 2724 | static void ixgbe_set_num_queues(struct ixgbe_adapter *adapter) |
2725 | { | 2725 | { |
2726 | /* Start with base case */ | ||
2727 | adapter->num_rx_queues = 1; | ||
2728 | adapter->num_tx_queues = 1; | ||
2729 | |||
2730 | #ifdef CONFIG_IXGBE_DCB | 2726 | #ifdef CONFIG_IXGBE_DCB |
2731 | if (ixgbe_set_dcb_queues(adapter)) | 2727 | if (ixgbe_set_dcb_queues(adapter)) |
2732 | return; | 2728 | goto done; |
2733 | 2729 | ||
2734 | #endif | 2730 | #endif |
2735 | if (ixgbe_set_rss_queues(adapter)) | 2731 | if (ixgbe_set_rss_queues(adapter)) |
2736 | return; | 2732 | goto done; |
2733 | |||
2734 | /* fallback to base case */ | ||
2735 | adapter->num_rx_queues = 1; | ||
2736 | adapter->num_tx_queues = 1; | ||
2737 | |||
2738 | done: | ||
2739 | /* Notify the stack of the (possibly) reduced Tx Queue count. */ | ||
2740 | adapter->netdev->real_num_tx_queues = adapter->num_tx_queues; | ||
2737 | } | 2741 | } |
2738 | 2742 | ||
2739 | static void ixgbe_acquire_msix_vectors(struct ixgbe_adapter *adapter, | 2743 | static void ixgbe_acquire_msix_vectors(struct ixgbe_adapter *adapter, |
@@ -2837,11 +2841,55 @@ static inline bool ixgbe_cache_ring_dcb(struct ixgbe_adapter *adapter) | |||
2837 | } | 2841 | } |
2838 | ret = true; | 2842 | ret = true; |
2839 | } else if (adapter->hw.mac.type == ixgbe_mac_82599EB) { | 2843 | } else if (adapter->hw.mac.type == ixgbe_mac_82599EB) { |
2840 | for (i = 0; i < dcb_i; i++) { | 2844 | if (dcb_i == 8) { |
2841 | adapter->rx_ring[i].reg_idx = i << 4; | 2845 | /* |
2842 | adapter->tx_ring[i].reg_idx = i << 4; | 2846 | * Tx TC0 starts at: descriptor queue 0 |
2847 | * Tx TC1 starts at: descriptor queue 32 | ||
2848 | * Tx TC2 starts at: descriptor queue 64 | ||
2849 | * Tx TC3 starts at: descriptor queue 80 | ||
2850 | * Tx TC4 starts at: descriptor queue 96 | ||
2851 | * Tx TC5 starts at: descriptor queue 104 | ||
2852 | * Tx TC6 starts at: descriptor queue 112 | ||
2853 | * Tx TC7 starts at: descriptor queue 120 | ||
2854 | * | ||
2855 | * Rx TC0-TC7 are offset by 16 queues each | ||
2856 | */ | ||
2857 | for (i = 0; i < 3; i++) { | ||
2858 | adapter->tx_ring[i].reg_idx = i << 5; | ||
2859 | adapter->rx_ring[i].reg_idx = i << 4; | ||
2860 | } | ||
2861 | for ( ; i < 5; i++) { | ||
2862 | adapter->tx_ring[i].reg_idx = | ||
2863 | ((i + 2) << 4); | ||
2864 | adapter->rx_ring[i].reg_idx = i << 4; | ||
2865 | } | ||
2866 | for ( ; i < dcb_i; i++) { | ||
2867 | adapter->tx_ring[i].reg_idx = | ||
2868 | ((i + 8) << 3); | ||
2869 | adapter->rx_ring[i].reg_idx = i << 4; | ||
2870 | } | ||
2871 | |||
2872 | ret = true; | ||
2873 | } else if (dcb_i == 4) { | ||
2874 | /* | ||
2875 | * Tx TC0 starts at: descriptor queue 0 | ||
2876 | * Tx TC1 starts at: descriptor queue 64 | ||
2877 | * Tx TC2 starts at: descriptor queue 96 | ||
2878 | * Tx TC3 starts at: descriptor queue 112 | ||
2879 | * | ||
2880 | * Rx TC0-TC3 are offset by 32 queues each | ||
2881 | */ | ||
2882 | adapter->tx_ring[0].reg_idx = 0; | ||
2883 | adapter->tx_ring[1].reg_idx = 64; | ||
2884 | adapter->tx_ring[2].reg_idx = 96; | ||
2885 | adapter->tx_ring[3].reg_idx = 112; | ||
2886 | for (i = 0 ; i < dcb_i; i++) | ||
2887 | adapter->rx_ring[i].reg_idx = i << 5; | ||
2888 | |||
2889 | ret = true; | ||
2890 | } else { | ||
2891 | ret = false; | ||
2843 | } | 2892 | } |
2844 | ret = true; | ||
2845 | } else { | 2893 | } else { |
2846 | ret = false; | 2894 | ret = false; |
2847 | } | 2895 | } |
@@ -2992,9 +3040,6 @@ try_msi: | |||
2992 | } | 3040 | } |
2993 | 3041 | ||
2994 | out: | 3042 | out: |
2995 | /* Notify the stack of the (possibly) reduced Tx Queue count. */ | ||
2996 | adapter->netdev->real_num_tx_queues = adapter->num_tx_queues; | ||
2997 | |||
2998 | return err; | 3043 | return err; |
2999 | } | 3044 | } |
3000 | 3045 | ||
@@ -3601,6 +3646,8 @@ static int ixgbe_resume(struct pci_dev *pdev) | |||
3601 | 3646 | ||
3602 | ixgbe_reset(adapter); | 3647 | ixgbe_reset(adapter); |
3603 | 3648 | ||
3649 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_WUS, ~0); | ||
3650 | |||
3604 | if (netif_running(netdev)) { | 3651 | if (netif_running(netdev)) { |
3605 | err = ixgbe_open(adapter->netdev); | 3652 | err = ixgbe_open(adapter->netdev); |
3606 | if (err) | 3653 | if (err) |
@@ -3611,9 +3658,9 @@ static int ixgbe_resume(struct pci_dev *pdev) | |||
3611 | 3658 | ||
3612 | return 0; | 3659 | return 0; |
3613 | } | 3660 | } |
3614 | |||
3615 | #endif /* CONFIG_PM */ | 3661 | #endif /* CONFIG_PM */ |
3616 | static int ixgbe_suspend(struct pci_dev *pdev, pm_message_t state) | 3662 | |
3663 | static int __ixgbe_shutdown(struct pci_dev *pdev, bool *enable_wake) | ||
3617 | { | 3664 | { |
3618 | struct net_device *netdev = pci_get_drvdata(pdev); | 3665 | struct net_device *netdev = pci_get_drvdata(pdev); |
3619 | struct ixgbe_adapter *adapter = netdev_priv(netdev); | 3666 | struct ixgbe_adapter *adapter = netdev_priv(netdev); |
@@ -3672,18 +3719,46 @@ static int ixgbe_suspend(struct pci_dev *pdev, pm_message_t state) | |||
3672 | pci_enable_wake(pdev, PCI_D3cold, 0); | 3719 | pci_enable_wake(pdev, PCI_D3cold, 0); |
3673 | } | 3720 | } |
3674 | 3721 | ||
3722 | *enable_wake = !!wufc; | ||
3723 | |||
3675 | ixgbe_release_hw_control(adapter); | 3724 | ixgbe_release_hw_control(adapter); |
3676 | 3725 | ||
3677 | pci_disable_device(pdev); | 3726 | pci_disable_device(pdev); |
3678 | 3727 | ||
3679 | pci_set_power_state(pdev, pci_choose_state(pdev, state)); | 3728 | return 0; |
3729 | } | ||
3730 | |||
3731 | #ifdef CONFIG_PM | ||
3732 | static int ixgbe_suspend(struct pci_dev *pdev, pm_message_t state) | ||
3733 | { | ||
3734 | int retval; | ||
3735 | bool wake; | ||
3736 | |||
3737 | retval = __ixgbe_shutdown(pdev, &wake); | ||
3738 | if (retval) | ||
3739 | return retval; | ||
3740 | |||
3741 | if (wake) { | ||
3742 | pci_prepare_to_sleep(pdev); | ||
3743 | } else { | ||
3744 | pci_wake_from_d3(pdev, false); | ||
3745 | pci_set_power_state(pdev, PCI_D3hot); | ||
3746 | } | ||
3680 | 3747 | ||
3681 | return 0; | 3748 | return 0; |
3682 | } | 3749 | } |
3750 | #endif /* CONFIG_PM */ | ||
3683 | 3751 | ||
3684 | static void ixgbe_shutdown(struct pci_dev *pdev) | 3752 | static void ixgbe_shutdown(struct pci_dev *pdev) |
3685 | { | 3753 | { |
3686 | ixgbe_suspend(pdev, PMSG_SUSPEND); | 3754 | bool wake; |
3755 | |||
3756 | __ixgbe_shutdown(pdev, &wake); | ||
3757 | |||
3758 | if (system_state == SYSTEM_POWER_OFF) { | ||
3759 | pci_wake_from_d3(pdev, wake); | ||
3760 | pci_set_power_state(pdev, PCI_D3hot); | ||
3761 | } | ||
3687 | } | 3762 | } |
3688 | 3763 | ||
3689 | /** | 3764 | /** |
@@ -3917,7 +3992,7 @@ static void ixgbe_sfp_config_module_task(struct work_struct *work) | |||
3917 | } | 3992 | } |
3918 | hw->mac.ops.setup_sfp(hw); | 3993 | hw->mac.ops.setup_sfp(hw); |
3919 | 3994 | ||
3920 | if (!adapter->flags & IXGBE_FLAG_IN_SFP_LINK_TASK) | 3995 | if (!(adapter->flags & IXGBE_FLAG_IN_SFP_LINK_TASK)) |
3921 | /* This will also work for DA Twinax connections */ | 3996 | /* This will also work for DA Twinax connections */ |
3922 | schedule_work(&adapter->multispeed_fiber_task); | 3997 | schedule_work(&adapter->multispeed_fiber_task); |
3923 | adapter->flags &= ~IXGBE_FLAG_IN_SFP_MOD_TASK; | 3998 | adapter->flags &= ~IXGBE_FLAG_IN_SFP_MOD_TASK; |
@@ -4342,7 +4417,7 @@ static int ixgbe_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
4342 | int count = 0; | 4417 | int count = 0; |
4343 | unsigned int f; | 4418 | unsigned int f; |
4344 | 4419 | ||
4345 | r_idx = (adapter->num_tx_queues - 1) & skb->queue_mapping; | 4420 | r_idx = skb->queue_mapping; |
4346 | tx_ring = &adapter->tx_ring[r_idx]; | 4421 | tx_ring = &adapter->tx_ring[r_idx]; |
4347 | 4422 | ||
4348 | if (adapter->vlgrp && vlan_tx_tag_present(skb)) { | 4423 | if (adapter->vlgrp && vlan_tx_tag_present(skb)) { |
@@ -4502,7 +4577,6 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev, | |||
4502 | const struct ixgbe_info *ii = ixgbe_info_tbl[ent->driver_data]; | 4577 | const struct ixgbe_info *ii = ixgbe_info_tbl[ent->driver_data]; |
4503 | static int cards_found; | 4578 | static int cards_found; |
4504 | int i, err, pci_using_dac; | 4579 | int i, err, pci_using_dac; |
4505 | u16 pm_value = 0; | ||
4506 | u32 part_num, eec; | 4580 | u32 part_num, eec; |
4507 | 4581 | ||
4508 | err = pci_enable_device(pdev); | 4582 | err = pci_enable_device(pdev); |
@@ -4690,11 +4764,8 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev, | |||
4690 | 4764 | ||
4691 | switch (pdev->device) { | 4765 | switch (pdev->device) { |
4692 | case IXGBE_DEV_ID_82599_KX4: | 4766 | case IXGBE_DEV_ID_82599_KX4: |
4693 | #define IXGBE_PCIE_PMCSR 0x44 | 4767 | adapter->wol = (IXGBE_WUFC_MAG | IXGBE_WUFC_EX | |
4694 | adapter->wol = IXGBE_WUFC_MAG; | 4768 | IXGBE_WUFC_MC | IXGBE_WUFC_BC); |
4695 | pci_read_config_word(pdev, IXGBE_PCIE_PMCSR, &pm_value); | ||
4696 | pci_write_config_word(pdev, IXGBE_PCIE_PMCSR, | ||
4697 | (pm_value | (1 << 8))); | ||
4698 | break; | 4769 | break; |
4699 | default: | 4770 | default: |
4700 | adapter->wol = 0; | 4771 | adapter->wol = 0; |