21 |
21 |
22 Contact Information: |
22 Contact Information: |
23 Linux NICS <linux.nics@intel.com> |
23 Linux NICS <linux.nics@intel.com> |
24 e1000-devel Mailing List <e1000-devel@lists.sourceforge.net> |
24 e1000-devel Mailing List <e1000-devel@lists.sourceforge.net> |
25 Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
25 Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
|
26 |
|
27 vim: noexpandtab |
26 |
28 |
27 *******************************************************************************/ |
29 *******************************************************************************/ |
28 |
30 |
29 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt |
31 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt |
30 |
32 |
1535 struct net_device *netdev = data; |
1537 struct net_device *netdev = data; |
1536 struct e1000_adapter *adapter = netdev_priv(netdev); |
1538 struct e1000_adapter *adapter = netdev_priv(netdev); |
1537 struct e1000_hw *hw = &adapter->hw; |
1539 struct e1000_hw *hw = &adapter->hw; |
1538 u32 icr = er32(ICR); |
1540 u32 icr = er32(ICR); |
1539 |
1541 |
1540 if (adapter->ecdev) { |
1542 if (adapter->ecdev) { |
1541 int ec_work_done = 0; |
1543 int ec_work_done = 0; |
1542 adapter->clean_rx(adapter, &ec_work_done, 100); |
1544 adapter->clean_rx(adapter, &ec_work_done, 100); |
1543 e1000_clean_tx_irq(adapter); |
1545 e1000_clean_tx_irq(adapter); |
1544 return IRQ_HANDLED; |
1546 return IRQ_HANDLED; |
1545 } |
1547 } |
1546 /* |
1548 /* |
1547 * read ICR disables interrupts using IAM |
1549 * read ICR disables interrupts using IAM |
1548 */ |
1550 */ |
1639 /* guard against interrupt when we're going down */ |
1641 /* guard against interrupt when we're going down */ |
1640 if (!test_bit(__E1000_DOWN, &adapter->state)) |
1642 if (!test_bit(__E1000_DOWN, &adapter->state)) |
1641 mod_timer(&adapter->watchdog_timer, jiffies + 1); |
1643 mod_timer(&adapter->watchdog_timer, jiffies + 1); |
1642 } |
1644 } |
1643 |
1645 |
1644 if (adapter->ecdev) { |
1646 if (adapter->ecdev) { |
1645 int ec_work_done = 0; |
1647 int ec_work_done = 0; |
1646 adapter->clean_rx(adapter, &ec_work_done, 100); |
1648 adapter->clean_rx(adapter, &ec_work_done, 100); |
1647 e1000_clean_tx_irq(adapter); |
1649 e1000_clean_tx_irq(adapter); |
1648 return IRQ_HANDLED; |
1650 return IRQ_HANDLED; |
1649 } |
1651 } |
1650 |
1652 |
1651 if (napi_schedule_prep(&adapter->napi)) { |
1653 if (napi_schedule_prep(&adapter->napi)) { |
1652 adapter->total_tx_bytes = 0; |
1654 adapter->total_tx_bytes = 0; |
1722 writel(1000000000 / (adapter->rx_ring->itr_val * 256), |
1724 writel(1000000000 / (adapter->rx_ring->itr_val * 256), |
1723 adapter->hw.hw_addr + adapter->rx_ring->itr_register); |
1725 adapter->hw.hw_addr + adapter->rx_ring->itr_register); |
1724 adapter->rx_ring->set_itr = 0; |
1726 adapter->rx_ring->set_itr = 0; |
1725 } |
1727 } |
1726 |
1728 |
1727 if (adapter->ecdev) { |
1729 if (adapter->ecdev) { |
1728 int ec_work_done = 0; |
1730 int ec_work_done = 0; |
1729 adapter->clean_rx(adapter, &ec_work_done, 100); |
1731 adapter->clean_rx(adapter, &ec_work_done, 100); |
1730 } else { |
1732 } else { |
1731 if (napi_schedule_prep(&adapter->napi)) { |
1733 if (napi_schedule_prep(&adapter->napi)) { |
1732 adapter->total_rx_bytes = 0; |
1734 adapter->total_rx_bytes = 0; |
1733 adapter->total_rx_packets = 0; |
1735 adapter->total_rx_packets = 0; |
1734 __napi_schedule(&adapter->napi); |
1736 __napi_schedule(&adapter->napi); |
3412 /* disable receives in the hardware */ |
3414 /* disable receives in the hardware */ |
3413 rctl = er32(RCTL); |
3415 rctl = er32(RCTL); |
3414 ew32(RCTL, rctl & ~E1000_RCTL_EN); |
3416 ew32(RCTL, rctl & ~E1000_RCTL_EN); |
3415 /* flush and sleep below */ |
3417 /* flush and sleep below */ |
3416 |
3418 |
3417 if (!adapter->ecdev) |
3419 if (!adapter->ecdev) |
3418 netif_stop_queue(netdev); |
3420 netif_stop_queue(netdev); |
3419 |
3421 |
3420 /* disable transmits in the hardware */ |
3422 /* disable transmits in the hardware */ |
3421 tctl = er32(TCTL); |
3423 tctl = er32(TCTL); |
3422 tctl &= ~E1000_TCTL_EN; |
3424 tctl &= ~E1000_TCTL_EN; |
3701 napi_enable(&adapter->napi); |
3703 napi_enable(&adapter->napi); |
3702 |
3704 |
3703 e1000_irq_enable(adapter); |
3705 e1000_irq_enable(adapter); |
3704 |
3706 |
3705 netif_start_queue(netdev); |
3707 netif_start_queue(netdev); |
3706 |
3708 } |
3707 adapter->idle_check = true; |
3709 |
3708 pm_runtime_put(&pdev->dev); |
3710 adapter->idle_check = true; |
3709 |
3711 pm_runtime_put(&pdev->dev); |
3710 /* fire a link status change interrupt to start the watchdog */ |
3712 |
3711 if (adapter->msix_entries) |
3713 /* fire a link status change interrupt to start the watchdog */ |
3712 ew32(ICS, E1000_ICS_LSC | E1000_ICR_OTHER); |
3714 if (adapter->msix_entries) |
3713 else |
3715 ew32(ICS, E1000_ICS_LSC | E1000_ICR_OTHER); |
3714 ew32(ICS, E1000_ICS_LSC); |
3716 else |
3715 } |
3717 ew32(ICS, E1000_ICS_LSC); |
3716 |
3718 |
3717 return 0; |
3719 return 0; |
3718 |
3720 |
3719 err_req_irq: |
3721 err_req_irq: |
3720 e1000_release_hw_control(adapter); |
3722 e1000_release_hw_control(adapter); |
4234 if ((e1000e_enable_tx_pkt_filtering(hw)) && |
4236 if ((e1000e_enable_tx_pkt_filtering(hw)) && |
4235 (adapter->mng_vlan_id != adapter->hw.mng_cookie.vlan_id)) |
4237 (adapter->mng_vlan_id != adapter->hw.mng_cookie.vlan_id)) |
4236 e1000_update_mng_vlan(adapter); |
4238 e1000_update_mng_vlan(adapter); |
4237 |
4239 |
4238 if (link) { |
4240 if (link) { |
4239 if ((adapter->ecdev && !ecdev_get_link(adapter->ecdev)) |
4241 if ((adapter->ecdev && !ecdev_get_link(adapter->ecdev)) |
4240 || (!adapter->ecdev && !netif_carrier_ok(netdev))) { |
4242 || (!adapter->ecdev && !netif_carrier_ok(netdev))) { |
4241 bool txb2b = 1; |
4243 bool txb2b = 1; |
4242 |
4244 |
4243 /* Cancel scheduled suspend requests. */ |
4245 /* Cancel scheduled suspend requests. */ |
4244 pm_runtime_resume(netdev->dev.parent); |
4246 pm_runtime_resume(netdev->dev.parent); |
4332 if (phy->ops.cfg_on_link_up) |
4334 if (phy->ops.cfg_on_link_up) |
4333 phy->ops.cfg_on_link_up(hw); |
4335 phy->ops.cfg_on_link_up(hw); |
4334 |
4336 |
4335 if (adapter->ecdev) |
4337 if (adapter->ecdev) |
4336 ecdev_set_link(adapter->ecdev, 1); |
4338 ecdev_set_link(adapter->ecdev, 1); |
4337 else |
4339 else |
4338 netif_carrier_on(netdev); |
4340 netif_carrier_on(netdev); |
4339 |
4341 |
4340 if (!adapter->ecdev && !test_bit(__E1000_DOWN, &adapter->state)) |
4342 if (!adapter->ecdev && !test_bit(__E1000_DOWN, &adapter->state)) |
4341 mod_timer(&adapter->phy_info_timer, |
4343 mod_timer(&adapter->phy_info_timer, |
4342 round_jiffies(jiffies + 2 * HZ)); |
4344 round_jiffies(jiffies + 2 * HZ)); |
4343 } |
4345 } |
4344 } else { |
4346 } else { |
4345 if ((adapter->ecdev && ecdev_get_link(adapter->ecdev)) |
4347 if ((adapter->ecdev && ecdev_get_link(adapter->ecdev)) |
4346 || (!adapter->ecdev && netif_carrier_ok(netdev))) { |
4348 || (!adapter->ecdev && netif_carrier_ok(netdev))) { |
4347 adapter->link_speed = 0; |
4349 adapter->link_speed = 0; |
4348 adapter->link_duplex = 0; |
4350 adapter->link_duplex = 0; |
4349 /* Link status message must follow this format */ |
4351 /* Link status message must follow this format */ |
4350 printk(KERN_INFO "e1000e: %s NIC Link is Down\n", |
4352 printk(KERN_INFO "e1000e: %s NIC Link is Down\n", |
4378 adapter->gotc = adapter->stats.gotc - adapter->gotc_old; |
4380 adapter->gotc = adapter->stats.gotc - adapter->gotc_old; |
4379 adapter->gotc_old = adapter->stats.gotc; |
4381 adapter->gotc_old = adapter->stats.gotc; |
4380 |
4382 |
4381 e1000e_update_adaptive(&adapter->hw); |
4383 e1000e_update_adaptive(&adapter->hw); |
4382 |
4384 |
4383 if ((adapter->ecdev && !ecdev_get_link(adapter->ecdev)) |
4385 if (!adapter->ecdev && !netif_carrier_ok(netdev)) { |
4384 || (!adapter->ecdev && !netif_carrier_ok(netdev))) { |
|
4385 tx_pending = (e1000_desc_unused(tx_ring) + 1 < |
4386 tx_pending = (e1000_desc_unused(tx_ring) + 1 < |
4386 tx_ring->count); |
4387 tx_ring->count); |
4387 if (tx_pending) { |
4388 if (tx_pending) { |
4388 /* |
4389 /* |
4389 * We've lost link, so the controller stops DMA, |
4390 * We've lost link, so the controller stops DMA, |
4791 } |
4792 } |
4792 |
4793 |
4793 static int __e1000_maybe_stop_tx(struct net_device *netdev, int size) |
4794 static int __e1000_maybe_stop_tx(struct net_device *netdev, int size) |
4794 { |
4795 { |
4795 struct e1000_adapter *adapter = netdev_priv(netdev); |
4796 struct e1000_adapter *adapter = netdev_priv(netdev); |
|
4797 |
|
4798 if (adapter->ecdev) { |
|
4799 return -EBUSY; |
|
4800 } |
4796 |
4801 |
4797 netif_stop_queue(netdev); |
4802 netif_stop_queue(netdev); |
4798 /* |
4803 /* |
4799 * Herbert's original patch had: |
4804 * Herbert's original patch had: |
4800 * smp_mb__after_netif_stop_queue(); |
4805 * smp_mb__after_netif_stop_queue(); |
5562 static void e1000_shutdown(struct pci_dev *pdev) |
5567 static void e1000_shutdown(struct pci_dev *pdev) |
5563 { |
5568 { |
5564 bool wake = false; |
5569 bool wake = false; |
5565 struct net_device *netdev = pci_get_drvdata(pdev); |
5570 struct net_device *netdev = pci_get_drvdata(pdev); |
5566 struct e1000_adapter *adapter = netdev_priv(netdev); |
5571 struct e1000_adapter *adapter = netdev_priv(netdev); |
5567 |
5572 |
5568 if (adapter->ecdev) |
5573 if (adapter->ecdev) |
5569 return; |
5574 return; |
5570 |
5575 |
5571 __e1000_shutdown(pdev, &wake, false); |
5576 __e1000_shutdown(pdev, &wake, false); |
5572 |
5577 |
5760 void ec_poll(struct net_device *netdev) |
5765 void ec_poll(struct net_device *netdev) |
5761 { |
5766 { |
5762 struct e1000_adapter *adapter = netdev_priv(netdev); |
5767 struct e1000_adapter *adapter = netdev_priv(netdev); |
5763 |
5768 |
5764 if (jiffies - adapter->ec_watchdog_jiffies >= 2 * HZ) { |
5769 if (jiffies - adapter->ec_watchdog_jiffies >= 2 * HZ) { |
5765 e1000_watchdog((unsigned long) adapter); |
5770 struct e1000_hw *hw = &adapter->hw; |
|
5771 hw->mac.get_link_status = true; |
|
5772 e1000_watchdog_task(&adapter->watchdog_task); |
5766 adapter->ec_watchdog_jiffies = jiffies; |
5773 adapter->ec_watchdog_jiffies = jiffies; |
5767 } |
5774 } |
5768 |
5775 |
5769 #ifdef CONFIG_PCI_MSI |
5776 #ifdef CONFIG_PCI_MSI |
5770 e1000_intr_msi(0,netdev); |
5777 e1000_intr_msi(0, netdev); |
5771 #else |
5778 #else |
5772 e1000_intr(0,netdev); |
5779 e1000_intr(0, netdev); |
5773 #endif |
5780 #endif |
5774 } |
5781 } |
5775 |
5782 |
5776 /** |
5783 /** |
5777 * e1000_probe - Device Initialization Routine |
5784 * e1000_probe - Device Initialization Routine |
6060 if (!(adapter->flags & FLAG_HAS_AMT)) |
6067 if (!(adapter->flags & FLAG_HAS_AMT)) |
6061 e1000_get_hw_control(adapter); |
6068 e1000_get_hw_control(adapter); |
6062 |
6069 |
6063 adapter->ecdev = ecdev_offer(netdev, ec_poll, THIS_MODULE); |
6070 adapter->ecdev = ecdev_offer(netdev, ec_poll, THIS_MODULE); |
6064 if (adapter->ecdev) { |
6071 if (adapter->ecdev) { |
6065 if (ecdev_open(adapter->ecdev)) { |
6072 err = ecdev_open(adapter->ecdev); |
|
6073 if (err) { |
6066 ecdev_withdraw(adapter->ecdev); |
6074 ecdev_withdraw(adapter->ecdev); |
6067 goto err_register; |
6075 goto err_register; |
6068 } |
6076 } |
|
6077 adapter->ec_watchdog_jiffies = jiffies; |
6069 } else { |
6078 } else { |
6070 strcpy(netdev->name, "eth%d"); |
6079 strcpy(netdev->name, "eth%d"); |
6071 err = register_netdev(netdev); |
6080 err = register_netdev(netdev); |
6072 if (err) |
6081 if (err) |
6073 goto err_register; |
6082 goto err_register; |