2154 **/ |
2154 **/ |
2155 static void e1000_irq_disable(struct e1000_adapter *adapter) |
2155 static void e1000_irq_disable(struct e1000_adapter *adapter) |
2156 { |
2156 { |
2157 struct e1000_hw *hw = &adapter->hw; |
2157 struct e1000_hw *hw = &adapter->hw; |
2158 |
2158 |
2159 if (adapter->ecdev) |
|
2160 return; |
|
2161 |
|
2162 ew32(IMC, ~0); |
2159 ew32(IMC, ~0); |
2163 if (adapter->msix_entries) |
2160 if (adapter->msix_entries) |
2164 ew32(EIAC_82574, 0); |
2161 ew32(EIAC_82574, 0); |
2165 e1e_flush(); |
2162 e1e_flush(); |
|
2163 |
|
2164 if (adapter->ecdev) { |
|
2165 return; |
|
2166 } |
2166 |
2167 |
2167 if (adapter->msix_entries) { |
2168 if (adapter->msix_entries) { |
2168 int i; |
2169 int i; |
2169 for (i = 0; i < adapter->num_vectors; i++) |
2170 for (i = 0; i < adapter->num_vectors; i++) |
2170 synchronize_irq(adapter->msix_entries[i].vector); |
2171 synchronize_irq(adapter->msix_entries[i].vector); |
3643 /* hardware has been reset, we need to reload some things */ |
3644 /* hardware has been reset, we need to reload some things */ |
3644 e1000_configure(adapter); |
3645 e1000_configure(adapter); |
3645 |
3646 |
3646 clear_bit(__E1000_DOWN, &adapter->state); |
3647 clear_bit(__E1000_DOWN, &adapter->state); |
3647 |
3648 |
3648 if (adapter->msix_entries) |
|
3649 e1000_configure_msix(adapter); |
|
3650 |
|
3651 if (!adapter->ecdev) { |
3649 if (!adapter->ecdev) { |
|
3650 if (adapter->msix_entries) |
|
3651 e1000_configure_msix(adapter); |
|
3652 |
3652 e1000_irq_enable(adapter); |
3653 e1000_irq_enable(adapter); |
3653 |
3654 |
3654 netif_start_queue(adapter->netdev); |
3655 netif_start_queue(adapter->netdev); |
3655 |
3656 |
3656 /* fire a link change interrupt to start the watchdog */ |
3657 /* fire a link change interrupt to start the watchdog */ |
3991 /* |
3992 /* |
3992 * Work around PCIe errata with MSI interrupts causing some chipsets to |
3993 * Work around PCIe errata with MSI interrupts causing some chipsets to |
3993 * ignore e1000e MSI messages, which means we need to test our MSI |
3994 * ignore e1000e MSI messages, which means we need to test our MSI |
3994 * interrupt now |
3995 * interrupt now |
3995 */ |
3996 */ |
3996 if (adapter->int_mode != E1000E_INT_MODE_LEGACY) { |
3997 if (!adapter->ecdev && adapter->int_mode != E1000E_INT_MODE_LEGACY) { |
3997 err = e1000_test_msi(adapter); |
3998 err = e1000_test_msi(adapter); |
3998 if (err) { |
3999 if (err) { |
3999 e_err("Interrupt allocation failed\n"); |
4000 e_err("Interrupt allocation failed\n"); |
4000 goto err_req_irq; |
4001 goto err_req_irq; |
4001 } |
4002 } |
4643 adapter->link_speed = 0; |
4644 adapter->link_speed = 0; |
4644 adapter->link_duplex = 0; |
4645 adapter->link_duplex = 0; |
4645 /* Link status message must follow this format */ |
4646 /* Link status message must follow this format */ |
4646 printk(KERN_INFO "e1000e: %s NIC Link is Down\n", |
4647 printk(KERN_INFO "e1000e: %s NIC Link is Down\n", |
4647 adapter->netdev->name); |
4648 adapter->netdev->name); |
4648 if (adapter->ecdev) |
4649 if (adapter->ecdev) { |
4649 ecdev_set_link(adapter->ecdev, 0); |
4650 ecdev_set_link(adapter->ecdev, 0); |
4650 else |
4651 } |
|
4652 else { |
4651 netif_carrier_off(netdev); |
4653 netif_carrier_off(netdev); |
4652 if (!adapter->ecdev && !test_bit(__E1000_DOWN, &adapter->state)) |
4654 if (!test_bit(__E1000_DOWN, &adapter->state)) |
4653 mod_timer(&adapter->phy_info_timer, |
4655 mod_timer(&adapter->phy_info_timer, |
4654 round_jiffies(jiffies + 2 * HZ)); |
4656 round_jiffies(jiffies + 2 * HZ)); |
|
4657 } |
4655 |
4658 |
4656 if (adapter->flags & FLAG_RX_NEEDS_RESTART) |
4659 if (adapter->flags & FLAG_RX_NEEDS_RESTART) |
4657 schedule_work(&adapter->reset_task); |
4660 schedule_work(&adapter->reset_task); |
4658 else |
4661 else |
4659 pm_schedule_suspend(netdev->dev.parent, |
4662 pm_schedule_suspend(netdev->dev.parent, |
4660 LINK_TIMEOUT); |
4663 LINK_TIMEOUT); |
4661 } |
4664 } |
4662 } |
4665 } |
4663 |
4666 |
4664 link_up: |
4667 link_up: |
4665 spin_lock(&adapter->stats64_lock); |
4668 spin_lock(&adapter->stats64_lock); |
6199 void ec_poll(struct net_device *netdev) |
6202 void ec_poll(struct net_device *netdev) |
6200 { |
6203 { |
6201 struct e1000_adapter *adapter = netdev_priv(netdev); |
6204 struct e1000_adapter *adapter = netdev_priv(netdev); |
6202 |
6205 |
6203 if (jiffies - adapter->ec_watchdog_jiffies >= 2 * HZ) { |
6206 if (jiffies - adapter->ec_watchdog_jiffies >= 2 * HZ) { |
6204 e1000_watchdog((unsigned long) adapter); |
6207 struct e1000_hw *hw = &adapter->hw; |
|
6208 hw->mac.get_link_status = true; |
|
6209 e1000_watchdog_task(&adapter->watchdog_task); |
6205 adapter->ec_watchdog_jiffies = jiffies; |
6210 adapter->ec_watchdog_jiffies = jiffies; |
6206 } |
6211 } |
6207 |
6212 |
6208 #ifdef CONFIG_PCI_MSI |
6213 #ifdef CONFIG_PCI_MSI |
6209 e1000_intr_msi(0, netdev); |
6214 e1000_intr_msi(0, netdev); |
6512 if (!(adapter->flags & FLAG_HAS_AMT)) |
6517 if (!(adapter->flags & FLAG_HAS_AMT)) |
6513 e1000e_get_hw_control(adapter); |
6518 e1000e_get_hw_control(adapter); |
6514 |
6519 |
6515 adapter->ecdev = ecdev_offer(netdev, ec_poll, THIS_MODULE); |
6520 adapter->ecdev = ecdev_offer(netdev, ec_poll, THIS_MODULE); |
6516 if (adapter->ecdev) { |
6521 if (adapter->ecdev) { |
|
6522 adapter->ec_watchdog_jiffies = jiffies; |
6517 if (ecdev_open(adapter->ecdev)) { |
6523 if (ecdev_open(adapter->ecdev)) { |
6518 ecdev_withdraw(adapter->ecdev); |
6524 ecdev_withdraw(adapter->ecdev); |
6519 goto err_register; |
6525 goto err_register; |
6520 } |
6526 } |
6521 } else { |
6527 } else { |