aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ixgbe/ixgbe_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/ixgbe/ixgbe_main.c')
-rw-r--r--drivers/net/ixgbe/ixgbe_main.c121
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 **/
2724static void ixgbe_set_num_queues(struct ixgbe_adapter *adapter) 2724static 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
2738done:
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
2739static void ixgbe_acquire_msix_vectors(struct ixgbe_adapter *adapter, 2743static 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
2994out: 3042out:
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 */
3616static int ixgbe_suspend(struct pci_dev *pdev, pm_message_t state) 3662
3663static 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
3732static 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
3684static void ixgbe_shutdown(struct pci_dev *pdev) 3752static 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;