diff options
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 | ||
