diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-07-20 20:43:29 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-07-20 20:43:29 -0400 |
commit | db6d8c7a4027b48d797b369a53f8470aaeed7063 (patch) | |
tree | e140c104a89abc2154e1f41a7db8ebecbb6fa0b4 /drivers/net/e1000e/netdev.c | |
parent | 3a533374283aea50eab3976d8a6d30532175f009 (diff) | |
parent | fb65a7c091529bfffb1262515252c0d0f6241c5c (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (1232 commits)
iucv: Fix bad merging.
net_sched: Add size table for qdiscs
net_sched: Add accessor function for packet length for qdiscs
net_sched: Add qdisc_enqueue wrapper
highmem: Export totalhigh_pages.
ipv6 mcast: Omit redundant address family checks in ip6_mc_source().
net: Use standard structures for generic socket address structures.
ipv6 netns: Make several "global" sysctl variables namespace aware.
netns: Use net_eq() to compare net-namespaces for optimization.
ipv6: remove unused macros from net/ipv6.h
ipv6: remove unused parameter from ip6_ra_control
tcp: fix kernel panic with listening_get_next
tcp: Remove redundant checks when setting eff_sacks
tcp: options clean up
tcp: Fix MD5 signatures for non-linear skbs
sctp: Update sctp global memory limit allocations.
sctp: remove unnecessary byteshifting, calculate directly in big-endian
sctp: Allow only 1 listening socket with SO_REUSEADDR
sctp: Do not leak memory on multiple listen() calls
sctp: Support ipv6only AF_INET6 sockets.
...
Diffstat (limited to 'drivers/net/e1000e/netdev.c')
-rw-r--r-- | drivers/net/e1000e/netdev.c | 84 |
1 files changed, 63 insertions, 21 deletions
diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c index 648a87bbf467..869544b8c05c 100644 --- a/drivers/net/e1000e/netdev.c +++ b/drivers/net/e1000e/netdev.c | |||
@@ -98,8 +98,7 @@ static void e1000_receive_skb(struct e1000_adapter *adapter, | |||
98 | 98 | ||
99 | if (adapter->vlgrp && (status & E1000_RXD_STAT_VP)) | 99 | if (adapter->vlgrp && (status & E1000_RXD_STAT_VP)) |
100 | vlan_hwaccel_receive_skb(skb, adapter->vlgrp, | 100 | vlan_hwaccel_receive_skb(skb, adapter->vlgrp, |
101 | le16_to_cpu(vlan) & | 101 | le16_to_cpu(vlan)); |
102 | E1000_RXD_SPC_VLAN_MASK); | ||
103 | else | 102 | else |
104 | netif_receive_skb(skb); | 103 | netif_receive_skb(skb); |
105 | 104 | ||
@@ -1793,7 +1792,6 @@ static void e1000_vlan_rx_register(struct net_device *netdev, | |||
1793 | if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER) { | 1792 | if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER) { |
1794 | /* enable VLAN receive filtering */ | 1793 | /* enable VLAN receive filtering */ |
1795 | rctl = er32(RCTL); | 1794 | rctl = er32(RCTL); |
1796 | rctl |= E1000_RCTL_VFE; | ||
1797 | rctl &= ~E1000_RCTL_CFIEN; | 1795 | rctl &= ~E1000_RCTL_CFIEN; |
1798 | ew32(RCTL, rctl); | 1796 | ew32(RCTL, rctl); |
1799 | e1000_update_mng_vlan(adapter); | 1797 | e1000_update_mng_vlan(adapter); |
@@ -1805,10 +1803,6 @@ static void e1000_vlan_rx_register(struct net_device *netdev, | |||
1805 | ew32(CTRL, ctrl); | 1803 | ew32(CTRL, ctrl); |
1806 | 1804 | ||
1807 | if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER) { | 1805 | if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER) { |
1808 | /* disable VLAN filtering */ | ||
1809 | rctl = er32(RCTL); | ||
1810 | rctl &= ~E1000_RCTL_VFE; | ||
1811 | ew32(RCTL, rctl); | ||
1812 | if (adapter->mng_vlan_id != | 1806 | if (adapter->mng_vlan_id != |
1813 | (u16)E1000_MNG_VLAN_NONE) { | 1807 | (u16)E1000_MNG_VLAN_NONE) { |
1814 | e1000_vlan_rx_kill_vid(netdev, | 1808 | e1000_vlan_rx_kill_vid(netdev, |
@@ -2231,11 +2225,16 @@ static void e1000_set_multi(struct net_device *netdev) | |||
2231 | 2225 | ||
2232 | if (netdev->flags & IFF_PROMISC) { | 2226 | if (netdev->flags & IFF_PROMISC) { |
2233 | rctl |= (E1000_RCTL_UPE | E1000_RCTL_MPE); | 2227 | rctl |= (E1000_RCTL_UPE | E1000_RCTL_MPE); |
2234 | } else if (netdev->flags & IFF_ALLMULTI) { | 2228 | rctl &= ~E1000_RCTL_VFE; |
2235 | rctl |= E1000_RCTL_MPE; | ||
2236 | rctl &= ~E1000_RCTL_UPE; | ||
2237 | } else { | 2229 | } else { |
2238 | rctl &= ~(E1000_RCTL_UPE | E1000_RCTL_MPE); | 2230 | if (netdev->flags & IFF_ALLMULTI) { |
2231 | rctl |= E1000_RCTL_MPE; | ||
2232 | rctl &= ~E1000_RCTL_UPE; | ||
2233 | } else { | ||
2234 | rctl &= ~(E1000_RCTL_UPE | E1000_RCTL_MPE); | ||
2235 | } | ||
2236 | if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER) | ||
2237 | rctl |= E1000_RCTL_VFE; | ||
2239 | } | 2238 | } |
2240 | 2239 | ||
2241 | ew32(RCTL, rctl); | 2240 | ew32(RCTL, rctl); |
@@ -2514,7 +2513,7 @@ void e1000e_down(struct e1000_adapter *adapter) | |||
2514 | ew32(RCTL, rctl & ~E1000_RCTL_EN); | 2513 | ew32(RCTL, rctl & ~E1000_RCTL_EN); |
2515 | /* flush and sleep below */ | 2514 | /* flush and sleep below */ |
2516 | 2515 | ||
2517 | netif_stop_queue(netdev); | 2516 | netif_tx_stop_all_queues(netdev); |
2518 | 2517 | ||
2519 | /* disable transmits in the hardware */ | 2518 | /* disable transmits in the hardware */ |
2520 | tctl = er32(TCTL); | 2519 | tctl = er32(TCTL); |
@@ -2664,6 +2663,8 @@ static int e1000_open(struct net_device *netdev) | |||
2664 | 2663 | ||
2665 | e1000_irq_enable(adapter); | 2664 | e1000_irq_enable(adapter); |
2666 | 2665 | ||
2666 | netif_tx_start_all_queues(netdev); | ||
2667 | |||
2667 | /* fire a link status change interrupt to start the watchdog */ | 2668 | /* fire a link status change interrupt to start the watchdog */ |
2668 | ew32(ICS, E1000_ICS_LSC); | 2669 | ew32(ICS, E1000_ICS_LSC); |
2669 | 2670 | ||
@@ -3119,7 +3120,7 @@ static void e1000_watchdog_task(struct work_struct *work) | |||
3119 | ew32(TCTL, tctl); | 3120 | ew32(TCTL, tctl); |
3120 | 3121 | ||
3121 | netif_carrier_on(netdev); | 3122 | netif_carrier_on(netdev); |
3122 | netif_wake_queue(netdev); | 3123 | netif_tx_wake_all_queues(netdev); |
3123 | 3124 | ||
3124 | if (!test_bit(__E1000_DOWN, &adapter->state)) | 3125 | if (!test_bit(__E1000_DOWN, &adapter->state)) |
3125 | mod_timer(&adapter->phy_info_timer, | 3126 | mod_timer(&adapter->phy_info_timer, |
@@ -3131,7 +3132,7 @@ static void e1000_watchdog_task(struct work_struct *work) | |||
3131 | adapter->link_duplex = 0; | 3132 | adapter->link_duplex = 0; |
3132 | ndev_info(netdev, "Link is Down\n"); | 3133 | ndev_info(netdev, "Link is Down\n"); |
3133 | netif_carrier_off(netdev); | 3134 | netif_carrier_off(netdev); |
3134 | netif_stop_queue(netdev); | 3135 | netif_tx_stop_all_queues(netdev); |
3135 | if (!test_bit(__E1000_DOWN, &adapter->state)) | 3136 | if (!test_bit(__E1000_DOWN, &adapter->state)) |
3136 | mod_timer(&adapter->phy_info_timer, | 3137 | mod_timer(&adapter->phy_info_timer, |
3137 | round_jiffies(jiffies + 2 * HZ)); | 3138 | round_jiffies(jiffies + 2 * HZ)); |
@@ -4003,7 +4004,11 @@ static int e1000_resume(struct pci_dev *pdev) | |||
4003 | pci_set_power_state(pdev, PCI_D0); | 4004 | pci_set_power_state(pdev, PCI_D0); |
4004 | pci_restore_state(pdev); | 4005 | pci_restore_state(pdev); |
4005 | e1000e_disable_l1aspm(pdev); | 4006 | e1000e_disable_l1aspm(pdev); |
4006 | err = pci_enable_device(pdev); | 4007 | |
4008 | if (adapter->need_ioport) | ||
4009 | err = pci_enable_device(pdev); | ||
4010 | else | ||
4011 | err = pci_enable_device_mem(pdev); | ||
4007 | if (err) { | 4012 | if (err) { |
4008 | dev_err(&pdev->dev, | 4013 | dev_err(&pdev->dev, |
4009 | "Cannot enable PCI device from suspend\n"); | 4014 | "Cannot enable PCI device from suspend\n"); |
@@ -4104,9 +4109,14 @@ static pci_ers_result_t e1000_io_slot_reset(struct pci_dev *pdev) | |||
4104 | struct net_device *netdev = pci_get_drvdata(pdev); | 4109 | struct net_device *netdev = pci_get_drvdata(pdev); |
4105 | struct e1000_adapter *adapter = netdev_priv(netdev); | 4110 | struct e1000_adapter *adapter = netdev_priv(netdev); |
4106 | struct e1000_hw *hw = &adapter->hw; | 4111 | struct e1000_hw *hw = &adapter->hw; |
4112 | int err; | ||
4107 | 4113 | ||
4108 | e1000e_disable_l1aspm(pdev); | 4114 | e1000e_disable_l1aspm(pdev); |
4109 | if (pci_enable_device(pdev)) { | 4115 | if (adapter->need_ioport) |
4116 | err = pci_enable_device(pdev); | ||
4117 | else | ||
4118 | err = pci_enable_device_mem(pdev); | ||
4119 | if (err) { | ||
4110 | dev_err(&pdev->dev, | 4120 | dev_err(&pdev->dev, |
4111 | "Cannot re-enable PCI device after reset.\n"); | 4121 | "Cannot re-enable PCI device after reset.\n"); |
4112 | return PCI_ERS_RESULT_DISCONNECT; | 4122 | return PCI_ERS_RESULT_DISCONNECT; |
@@ -4185,6 +4195,21 @@ static void e1000_print_device_info(struct e1000_adapter *adapter) | |||
4185 | } | 4195 | } |
4186 | 4196 | ||
4187 | /** | 4197 | /** |
4198 | * e1000e_is_need_ioport - determine if an adapter needs ioport resources or not | ||
4199 | * @pdev: PCI device information struct | ||
4200 | * | ||
4201 | * Returns true if an adapters needs ioport resources | ||
4202 | **/ | ||
4203 | static int e1000e_is_need_ioport(struct pci_dev *pdev) | ||
4204 | { | ||
4205 | switch (pdev->device) { | ||
4206 | /* Currently there are no adapters that need ioport resources */ | ||
4207 | default: | ||
4208 | return false; | ||
4209 | } | ||
4210 | } | ||
4211 | |||
4212 | /** | ||
4188 | * e1000_probe - Device Initialization Routine | 4213 | * e1000_probe - Device Initialization Routine |
4189 | * @pdev: PCI device information struct | 4214 | * @pdev: PCI device information struct |
4190 | * @ent: entry in e1000_pci_tbl | 4215 | * @ent: entry in e1000_pci_tbl |
@@ -4209,9 +4234,19 @@ static int __devinit e1000_probe(struct pci_dev *pdev, | |||
4209 | int i, err, pci_using_dac; | 4234 | int i, err, pci_using_dac; |
4210 | u16 eeprom_data = 0; | 4235 | u16 eeprom_data = 0; |
4211 | u16 eeprom_apme_mask = E1000_EEPROM_APME; | 4236 | u16 eeprom_apme_mask = E1000_EEPROM_APME; |
4237 | int bars, need_ioport; | ||
4212 | 4238 | ||
4213 | e1000e_disable_l1aspm(pdev); | 4239 | e1000e_disable_l1aspm(pdev); |
4214 | err = pci_enable_device(pdev); | 4240 | |
4241 | /* do not allocate ioport bars when not needed */ | ||
4242 | need_ioport = e1000e_is_need_ioport(pdev); | ||
4243 | if (need_ioport) { | ||
4244 | bars = pci_select_bars(pdev, IORESOURCE_MEM | IORESOURCE_IO); | ||
4245 | err = pci_enable_device(pdev); | ||
4246 | } else { | ||
4247 | bars = pci_select_bars(pdev, IORESOURCE_MEM); | ||
4248 | err = pci_enable_device_mem(pdev); | ||
4249 | } | ||
4215 | if (err) | 4250 | if (err) |
4216 | return err; | 4251 | return err; |
4217 | 4252 | ||
@@ -4234,7 +4269,7 @@ static int __devinit e1000_probe(struct pci_dev *pdev, | |||
4234 | } | 4269 | } |
4235 | } | 4270 | } |
4236 | 4271 | ||
4237 | err = pci_request_regions(pdev, e1000e_driver_name); | 4272 | err = pci_request_selected_regions(pdev, bars, e1000e_driver_name); |
4238 | if (err) | 4273 | if (err) |
4239 | goto err_pci_reg; | 4274 | goto err_pci_reg; |
4240 | 4275 | ||
@@ -4259,6 +4294,8 @@ static int __devinit e1000_probe(struct pci_dev *pdev, | |||
4259 | adapter->hw.adapter = adapter; | 4294 | adapter->hw.adapter = adapter; |
4260 | adapter->hw.mac.type = ei->mac; | 4295 | adapter->hw.mac.type = ei->mac; |
4261 | adapter->msg_enable = (1 << NETIF_MSG_DRV | NETIF_MSG_PROBE) - 1; | 4296 | adapter->msg_enable = (1 << NETIF_MSG_DRV | NETIF_MSG_PROBE) - 1; |
4297 | adapter->bars = bars; | ||
4298 | adapter->need_ioport = need_ioport; | ||
4262 | 4299 | ||
4263 | mmio_start = pci_resource_start(pdev, 0); | 4300 | mmio_start = pci_resource_start(pdev, 0); |
4264 | mmio_len = pci_resource_len(pdev, 0); | 4301 | mmio_len = pci_resource_len(pdev, 0); |
@@ -4344,6 +4381,11 @@ static int __devinit e1000_probe(struct pci_dev *pdev, | |||
4344 | netdev->features |= NETIF_F_TSO; | 4381 | netdev->features |= NETIF_F_TSO; |
4345 | netdev->features |= NETIF_F_TSO6; | 4382 | netdev->features |= NETIF_F_TSO6; |
4346 | 4383 | ||
4384 | netdev->vlan_features |= NETIF_F_TSO; | ||
4385 | netdev->vlan_features |= NETIF_F_TSO6; | ||
4386 | netdev->vlan_features |= NETIF_F_HW_CSUM; | ||
4387 | netdev->vlan_features |= NETIF_F_SG; | ||
4388 | |||
4347 | if (pci_using_dac) | 4389 | if (pci_using_dac) |
4348 | netdev->features |= NETIF_F_HIGHDMA; | 4390 | netdev->features |= NETIF_F_HIGHDMA; |
4349 | 4391 | ||
@@ -4464,7 +4506,7 @@ static int __devinit e1000_probe(struct pci_dev *pdev, | |||
4464 | 4506 | ||
4465 | /* tell the stack to leave us alone until e1000_open() is called */ | 4507 | /* tell the stack to leave us alone until e1000_open() is called */ |
4466 | netif_carrier_off(netdev); | 4508 | netif_carrier_off(netdev); |
4467 | netif_stop_queue(netdev); | 4509 | netif_tx_stop_all_queues(netdev); |
4468 | 4510 | ||
4469 | strcpy(netdev->name, "eth%d"); | 4511 | strcpy(netdev->name, "eth%d"); |
4470 | err = register_netdev(netdev); | 4512 | err = register_netdev(netdev); |
@@ -4493,7 +4535,7 @@ err_sw_init: | |||
4493 | err_ioremap: | 4535 | err_ioremap: |
4494 | free_netdev(netdev); | 4536 | free_netdev(netdev); |
4495 | err_alloc_etherdev: | 4537 | err_alloc_etherdev: |
4496 | pci_release_regions(pdev); | 4538 | pci_release_selected_regions(pdev, bars); |
4497 | err_pci_reg: | 4539 | err_pci_reg: |
4498 | err_dma: | 4540 | err_dma: |
4499 | pci_disable_device(pdev); | 4541 | pci_disable_device(pdev); |
@@ -4541,7 +4583,7 @@ static void __devexit e1000_remove(struct pci_dev *pdev) | |||
4541 | iounmap(adapter->hw.hw_addr); | 4583 | iounmap(adapter->hw.hw_addr); |
4542 | if (adapter->hw.flash_address) | 4584 | if (adapter->hw.flash_address) |
4543 | iounmap(adapter->hw.flash_address); | 4585 | iounmap(adapter->hw.flash_address); |
4544 | pci_release_regions(pdev); | 4586 | pci_release_selected_regions(pdev, adapter->bars); |
4545 | 4587 | ||
4546 | free_netdev(netdev); | 4588 | free_netdev(netdev); |
4547 | 4589 | ||