diff options
Diffstat (limited to 'drivers/net/e1000e/netdev.c')
| -rw-r--r-- | drivers/net/e1000e/netdev.c | 150 |
1 files changed, 71 insertions, 79 deletions
diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c index b96532a38322..5f70c437fa41 100644 --- a/drivers/net/e1000e/netdev.c +++ b/drivers/net/e1000e/netdev.c | |||
| @@ -26,6 +26,8 @@ | |||
| 26 | 26 | ||
| 27 | *******************************************************************************/ | 27 | *******************************************************************************/ |
| 28 | 28 | ||
| 29 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt | ||
| 30 | |||
| 29 | #include <linux/module.h> | 31 | #include <linux/module.h> |
| 30 | #include <linux/types.h> | 32 | #include <linux/types.h> |
| 31 | #include <linux/init.h> | 33 | #include <linux/init.h> |
| @@ -36,6 +38,7 @@ | |||
| 36 | #include <linux/netdevice.h> | 38 | #include <linux/netdevice.h> |
| 37 | #include <linux/tcp.h> | 39 | #include <linux/tcp.h> |
| 38 | #include <linux/ipv6.h> | 40 | #include <linux/ipv6.h> |
| 41 | #include <linux/slab.h> | ||
| 39 | #include <net/checksum.h> | 42 | #include <net/checksum.h> |
| 40 | #include <net/ip6_checksum.h> | 43 | #include <net/ip6_checksum.h> |
| 41 | #include <linux/mii.h> | 44 | #include <linux/mii.h> |
| @@ -661,6 +664,8 @@ static bool e1000_clean_tx_irq(struct e1000_adapter *adapter) | |||
| 661 | i = 0; | 664 | i = 0; |
| 662 | } | 665 | } |
| 663 | 666 | ||
| 667 | if (i == tx_ring->next_to_use) | ||
| 668 | break; | ||
| 664 | eop = tx_ring->buffer_info[i].next_to_watch; | 669 | eop = tx_ring->buffer_info[i].next_to_watch; |
| 665 | eop_desc = E1000_TX_DESC(*tx_ring, eop); | 670 | eop_desc = E1000_TX_DESC(*tx_ring, eop); |
| 666 | } | 671 | } |
| @@ -2290,8 +2295,6 @@ static void e1000_configure_tx(struct e1000_adapter *adapter) | |||
| 2290 | ew32(TCTL, tctl); | 2295 | ew32(TCTL, tctl); |
| 2291 | 2296 | ||
| 2292 | e1000e_config_collision_dist(hw); | 2297 | e1000e_config_collision_dist(hw); |
| 2293 | |||
| 2294 | adapter->tx_queue_len = adapter->netdev->tx_queue_len; | ||
| 2295 | } | 2298 | } |
| 2296 | 2299 | ||
| 2297 | /** | 2300 | /** |
| @@ -2565,7 +2568,7 @@ static void e1000_set_multi(struct net_device *netdev) | |||
| 2565 | { | 2568 | { |
| 2566 | struct e1000_adapter *adapter = netdev_priv(netdev); | 2569 | struct e1000_adapter *adapter = netdev_priv(netdev); |
| 2567 | struct e1000_hw *hw = &adapter->hw; | 2570 | struct e1000_hw *hw = &adapter->hw; |
| 2568 | struct dev_mc_list *mc_ptr; | 2571 | struct netdev_hw_addr *ha; |
| 2569 | u8 *mta_list; | 2572 | u8 *mta_list; |
| 2570 | u32 rctl; | 2573 | u32 rctl; |
| 2571 | int i; | 2574 | int i; |
| @@ -2597,9 +2600,8 @@ static void e1000_set_multi(struct net_device *netdev) | |||
| 2597 | 2600 | ||
| 2598 | /* prepare a packed array of only addresses. */ | 2601 | /* prepare a packed array of only addresses. */ |
| 2599 | i = 0; | 2602 | i = 0; |
| 2600 | netdev_for_each_mc_addr(mc_ptr, netdev) | 2603 | netdev_for_each_mc_addr(ha, netdev) |
| 2601 | memcpy(mta_list + (i++ * ETH_ALEN), | 2604 | memcpy(mta_list + (i++ * ETH_ALEN), ha->addr, ETH_ALEN); |
| 2602 | mc_ptr->dmi_addr, ETH_ALEN); | ||
| 2603 | 2605 | ||
| 2604 | e1000_update_mc_addr_list(hw, mta_list, i); | 2606 | e1000_update_mc_addr_list(hw, mta_list, i); |
| 2605 | kfree(mta_list); | 2607 | kfree(mta_list); |
| @@ -2878,7 +2880,6 @@ void e1000e_down(struct e1000_adapter *adapter) | |||
| 2878 | del_timer_sync(&adapter->watchdog_timer); | 2880 | del_timer_sync(&adapter->watchdog_timer); |
| 2879 | del_timer_sync(&adapter->phy_info_timer); | 2881 | del_timer_sync(&adapter->phy_info_timer); |
| 2880 | 2882 | ||
| 2881 | netdev->tx_queue_len = adapter->tx_queue_len; | ||
| 2882 | netif_carrier_off(netdev); | 2883 | netif_carrier_off(netdev); |
| 2883 | adapter->link_speed = 0; | 2884 | adapter->link_speed = 0; |
| 2884 | adapter->link_duplex = 0; | 2885 | adapter->link_duplex = 0; |
| @@ -3611,21 +3612,15 @@ static void e1000_watchdog_task(struct work_struct *work) | |||
| 3611 | "link gets many collisions.\n"); | 3612 | "link gets many collisions.\n"); |
| 3612 | } | 3613 | } |
| 3613 | 3614 | ||
| 3614 | /* | 3615 | /* adjust timeout factor according to speed/duplex */ |
| 3615 | * tweak tx_queue_len according to speed/duplex | ||
| 3616 | * and adjust the timeout factor | ||
| 3617 | */ | ||
| 3618 | netdev->tx_queue_len = adapter->tx_queue_len; | ||
| 3619 | adapter->tx_timeout_factor = 1; | 3616 | adapter->tx_timeout_factor = 1; |
| 3620 | switch (adapter->link_speed) { | 3617 | switch (adapter->link_speed) { |
| 3621 | case SPEED_10: | 3618 | case SPEED_10: |
| 3622 | txb2b = 0; | 3619 | txb2b = 0; |
| 3623 | netdev->tx_queue_len = 10; | ||
| 3624 | adapter->tx_timeout_factor = 16; | 3620 | adapter->tx_timeout_factor = 16; |
| 3625 | break; | 3621 | break; |
| 3626 | case SPEED_100: | 3622 | case SPEED_100: |
| 3627 | txb2b = 0; | 3623 | txb2b = 0; |
| 3628 | netdev->tx_queue_len = 100; | ||
| 3629 | adapter->tx_timeout_factor = 10; | 3624 | adapter->tx_timeout_factor = 10; |
| 3630 | break; | 3625 | break; |
| 3631 | } | 3626 | } |
| @@ -4137,7 +4132,7 @@ static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb, | |||
| 4137 | unsigned int max_per_txd = E1000_MAX_PER_TXD; | 4132 | unsigned int max_per_txd = E1000_MAX_PER_TXD; |
| 4138 | unsigned int max_txd_pwr = E1000_MAX_TXD_PWR; | 4133 | unsigned int max_txd_pwr = E1000_MAX_TXD_PWR; |
| 4139 | unsigned int tx_flags = 0; | 4134 | unsigned int tx_flags = 0; |
| 4140 | unsigned int len = skb->len - skb->data_len; | 4135 | unsigned int len = skb_headlen(skb); |
| 4141 | unsigned int nr_frags; | 4136 | unsigned int nr_frags; |
| 4142 | unsigned int mss; | 4137 | unsigned int mss; |
| 4143 | int count = 0; | 4138 | int count = 0; |
| @@ -4187,7 +4182,7 @@ static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb, | |||
| 4187 | dev_kfree_skb_any(skb); | 4182 | dev_kfree_skb_any(skb); |
| 4188 | return NETDEV_TX_OK; | 4183 | return NETDEV_TX_OK; |
| 4189 | } | 4184 | } |
| 4190 | len = skb->len - skb->data_len; | 4185 | len = skb_headlen(skb); |
| 4191 | } | 4186 | } |
| 4192 | } | 4187 | } |
| 4193 | 4188 | ||
| @@ -4664,58 +4659,12 @@ static void e1000e_disable_l1aspm(struct pci_dev *pdev) | |||
| 4664 | } | 4659 | } |
| 4665 | } | 4660 | } |
| 4666 | 4661 | ||
| 4667 | #ifdef CONFIG_PM | 4662 | #ifdef CONFIG_PM_OPS |
| 4668 | static bool e1000e_pm_ready(struct e1000_adapter *adapter) | 4663 | static bool e1000e_pm_ready(struct e1000_adapter *adapter) |
| 4669 | { | 4664 | { |
| 4670 | return !!adapter->tx_ring->buffer_info; | 4665 | return !!adapter->tx_ring->buffer_info; |
| 4671 | } | 4666 | } |
| 4672 | 4667 | ||
| 4673 | static int e1000_idle(struct device *dev) | ||
| 4674 | { | ||
| 4675 | struct pci_dev *pdev = to_pci_dev(dev); | ||
| 4676 | struct net_device *netdev = pci_get_drvdata(pdev); | ||
| 4677 | struct e1000_adapter *adapter = netdev_priv(netdev); | ||
| 4678 | |||
| 4679 | if (!e1000e_pm_ready(adapter)) | ||
| 4680 | return 0; | ||
| 4681 | |||
| 4682 | if (adapter->idle_check) { | ||
| 4683 | adapter->idle_check = false; | ||
| 4684 | if (!e1000e_has_link(adapter)) | ||
| 4685 | pm_schedule_suspend(dev, MSEC_PER_SEC); | ||
| 4686 | } | ||
| 4687 | |||
| 4688 | return -EBUSY; | ||
| 4689 | } | ||
| 4690 | |||
| 4691 | static int e1000_suspend(struct device *dev) | ||
| 4692 | { | ||
| 4693 | struct pci_dev *pdev = to_pci_dev(dev); | ||
| 4694 | int retval; | ||
| 4695 | bool wake; | ||
| 4696 | |||
| 4697 | retval = __e1000_shutdown(pdev, &wake, false); | ||
| 4698 | if (!retval) | ||
| 4699 | e1000_complete_shutdown(pdev, true, wake); | ||
| 4700 | |||
| 4701 | return retval; | ||
| 4702 | } | ||
| 4703 | |||
| 4704 | static int e1000_runtime_suspend(struct device *dev) | ||
| 4705 | { | ||
| 4706 | struct pci_dev *pdev = to_pci_dev(dev); | ||
| 4707 | struct net_device *netdev = pci_get_drvdata(pdev); | ||
| 4708 | struct e1000_adapter *adapter = netdev_priv(netdev); | ||
| 4709 | |||
| 4710 | if (e1000e_pm_ready(adapter)) { | ||
| 4711 | bool wake; | ||
| 4712 | |||
| 4713 | __e1000_shutdown(pdev, &wake, true); | ||
| 4714 | } | ||
| 4715 | |||
| 4716 | return 0; | ||
| 4717 | } | ||
| 4718 | |||
| 4719 | static int __e1000_resume(struct pci_dev *pdev) | 4668 | static int __e1000_resume(struct pci_dev *pdev) |
| 4720 | { | 4669 | { |
| 4721 | struct net_device *netdev = pci_get_drvdata(pdev); | 4670 | struct net_device *netdev = pci_get_drvdata(pdev); |
| @@ -4783,6 +4732,20 @@ static int __e1000_resume(struct pci_dev *pdev) | |||
| 4783 | return 0; | 4732 | return 0; |
| 4784 | } | 4733 | } |
| 4785 | 4734 | ||
| 4735 | #ifdef CONFIG_PM_SLEEP | ||
| 4736 | static int e1000_suspend(struct device *dev) | ||
| 4737 | { | ||
| 4738 | struct pci_dev *pdev = to_pci_dev(dev); | ||
| 4739 | int retval; | ||
| 4740 | bool wake; | ||
| 4741 | |||
| 4742 | retval = __e1000_shutdown(pdev, &wake, false); | ||
| 4743 | if (!retval) | ||
| 4744 | e1000_complete_shutdown(pdev, true, wake); | ||
| 4745 | |||
| 4746 | return retval; | ||
| 4747 | } | ||
| 4748 | |||
| 4786 | static int e1000_resume(struct device *dev) | 4749 | static int e1000_resume(struct device *dev) |
| 4787 | { | 4750 | { |
| 4788 | struct pci_dev *pdev = to_pci_dev(dev); | 4751 | struct pci_dev *pdev = to_pci_dev(dev); |
| @@ -4794,6 +4757,41 @@ static int e1000_resume(struct device *dev) | |||
| 4794 | 4757 | ||
| 4795 | return __e1000_resume(pdev); | 4758 | return __e1000_resume(pdev); |
| 4796 | } | 4759 | } |
| 4760 | #endif /* CONFIG_PM_SLEEP */ | ||
| 4761 | |||
| 4762 | #ifdef CONFIG_PM_RUNTIME | ||
| 4763 | static int e1000_runtime_suspend(struct device *dev) | ||
| 4764 | { | ||
| 4765 | struct pci_dev *pdev = to_pci_dev(dev); | ||
| 4766 | struct net_device *netdev = pci_get_drvdata(pdev); | ||
| 4767 | struct e1000_adapter *adapter = netdev_priv(netdev); | ||
| 4768 | |||
| 4769 | if (e1000e_pm_ready(adapter)) { | ||
| 4770 | bool wake; | ||
| 4771 | |||
| 4772 | __e1000_shutdown(pdev, &wake, true); | ||
| 4773 | } | ||
| 4774 | |||
| 4775 | return 0; | ||
| 4776 | } | ||
| 4777 | |||
| 4778 | static int e1000_idle(struct device *dev) | ||
| 4779 | { | ||
| 4780 | struct pci_dev *pdev = to_pci_dev(dev); | ||
| 4781 | struct net_device *netdev = pci_get_drvdata(pdev); | ||
| 4782 | struct e1000_adapter *adapter = netdev_priv(netdev); | ||
| 4783 | |||
| 4784 | if (!e1000e_pm_ready(adapter)) | ||
| 4785 | return 0; | ||
| 4786 | |||
| 4787 | if (adapter->idle_check) { | ||
| 4788 | adapter->idle_check = false; | ||
| 4789 | if (!e1000e_has_link(adapter)) | ||
| 4790 | pm_schedule_suspend(dev, MSEC_PER_SEC); | ||
| 4791 | } | ||
| 4792 | |||
| 4793 | return -EBUSY; | ||
| 4794 | } | ||
| 4797 | 4795 | ||
| 4798 | static int e1000_runtime_resume(struct device *dev) | 4796 | static int e1000_runtime_resume(struct device *dev) |
| 4799 | { | 4797 | { |
| @@ -4807,7 +4805,8 @@ static int e1000_runtime_resume(struct device *dev) | |||
| 4807 | adapter->idle_check = !dev->power.runtime_auto; | 4805 | adapter->idle_check = !dev->power.runtime_auto; |
| 4808 | return __e1000_resume(pdev); | 4806 | return __e1000_resume(pdev); |
| 4809 | } | 4807 | } |
| 4810 | #endif | 4808 | #endif /* CONFIG_PM_RUNTIME */ |
| 4809 | #endif /* CONFIG_PM_OPS */ | ||
| 4811 | 4810 | ||
| 4812 | static void e1000_shutdown(struct pci_dev *pdev) | 4811 | static void e1000_shutdown(struct pci_dev *pdev) |
| 4813 | { | 4812 | { |
| @@ -5475,17 +5474,11 @@ static DEFINE_PCI_DEVICE_TABLE(e1000_pci_tbl) = { | |||
| 5475 | }; | 5474 | }; |
| 5476 | MODULE_DEVICE_TABLE(pci, e1000_pci_tbl); | 5475 | MODULE_DEVICE_TABLE(pci, e1000_pci_tbl); |
| 5477 | 5476 | ||
| 5478 | #ifdef CONFIG_PM | 5477 | #ifdef CONFIG_PM_OPS |
| 5479 | static const struct dev_pm_ops e1000_pm_ops = { | 5478 | static const struct dev_pm_ops e1000_pm_ops = { |
| 5480 | .suspend = e1000_suspend, | 5479 | SET_SYSTEM_SLEEP_PM_OPS(e1000_suspend, e1000_resume) |
| 5481 | .resume = e1000_resume, | 5480 | SET_RUNTIME_PM_OPS(e1000_runtime_suspend, |
| 5482 | .freeze = e1000_suspend, | 5481 | e1000_runtime_resume, e1000_idle) |
| 5483 | .thaw = e1000_resume, | ||
| 5484 | .poweroff = e1000_suspend, | ||
| 5485 | .restore = e1000_resume, | ||
| 5486 | .runtime_suspend = e1000_runtime_suspend, | ||
| 5487 | .runtime_resume = e1000_runtime_resume, | ||
| 5488 | .runtime_idle = e1000_idle, | ||
| 5489 | }; | 5482 | }; |
| 5490 | #endif | 5483 | #endif |
| 5491 | 5484 | ||
| @@ -5495,7 +5488,7 @@ static struct pci_driver e1000_driver = { | |||
| 5495 | .id_table = e1000_pci_tbl, | 5488 | .id_table = e1000_pci_tbl, |
| 5496 | .probe = e1000_probe, | 5489 | .probe = e1000_probe, |
| 5497 | .remove = __devexit_p(e1000_remove), | 5490 | .remove = __devexit_p(e1000_remove), |
| 5498 | #ifdef CONFIG_PM | 5491 | #ifdef CONFIG_PM_OPS |
| 5499 | .driver.pm = &e1000_pm_ops, | 5492 | .driver.pm = &e1000_pm_ops, |
| 5500 | #endif | 5493 | #endif |
| 5501 | .shutdown = e1000_shutdown, | 5494 | .shutdown = e1000_shutdown, |
| @@ -5511,10 +5504,9 @@ static struct pci_driver e1000_driver = { | |||
| 5511 | static int __init e1000_init_module(void) | 5504 | static int __init e1000_init_module(void) |
| 5512 | { | 5505 | { |
| 5513 | int ret; | 5506 | int ret; |
| 5514 | printk(KERN_INFO "%s: Intel(R) PRO/1000 Network Driver - %s\n", | 5507 | pr_info("Intel(R) PRO/1000 Network Driver - %s\n", |
| 5515 | e1000e_driver_name, e1000e_driver_version); | 5508 | e1000e_driver_version); |
| 5516 | printk(KERN_INFO "%s: Copyright (c) 1999 - 2009 Intel Corporation.\n", | 5509 | pr_info("Copyright (c) 1999 - 2009 Intel Corporation.\n"); |
| 5517 | e1000e_driver_name); | ||
| 5518 | ret = pci_register_driver(&e1000_driver); | 5510 | ret = pci_register_driver(&e1000_driver); |
| 5519 | 5511 | ||
| 5520 | return ret; | 5512 | return ret; |
