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 |
1530 struct net_device *netdev = data; |
1532 struct net_device *netdev = data; |
1531 struct e1000_adapter *adapter = netdev_priv(netdev); |
1533 struct e1000_adapter *adapter = netdev_priv(netdev); |
1532 struct e1000_hw *hw = &adapter->hw; |
1534 struct e1000_hw *hw = &adapter->hw; |
1533 u32 icr = er32(ICR); |
1535 u32 icr = er32(ICR); |
1534 |
1536 |
1535 if (adapter->ecdev) { |
1537 if (adapter->ecdev) { |
1536 int ec_work_done = 0; |
1538 int ec_work_done = 0; |
1537 adapter->clean_rx(adapter, &ec_work_done, 100); |
1539 adapter->clean_rx(adapter, &ec_work_done, 100); |
1538 e1000_clean_tx_irq(adapter); |
1540 e1000_clean_tx_irq(adapter); |
1539 return IRQ_HANDLED; |
1541 return IRQ_HANDLED; |
1540 } |
1542 } |
1541 /* |
1543 /* |
1542 * read ICR disables interrupts using IAM |
1544 * read ICR disables interrupts using IAM |
1543 */ |
1545 */ |
1634 /* guard against interrupt when we're going down */ |
1636 /* guard against interrupt when we're going down */ |
1635 if (!test_bit(__E1000_DOWN, &adapter->state)) |
1637 if (!test_bit(__E1000_DOWN, &adapter->state)) |
1636 mod_timer(&adapter->watchdog_timer, jiffies + 1); |
1638 mod_timer(&adapter->watchdog_timer, jiffies + 1); |
1637 } |
1639 } |
1638 |
1640 |
1639 if (adapter->ecdev) { |
1641 if (adapter->ecdev) { |
1640 int ec_work_done = 0; |
1642 int ec_work_done = 0; |
1641 adapter->clean_rx(adapter, &ec_work_done, 100); |
1643 adapter->clean_rx(adapter, &ec_work_done, 100); |
1642 e1000_clean_tx_irq(adapter); |
1644 e1000_clean_tx_irq(adapter); |
1643 return IRQ_HANDLED; |
1645 return IRQ_HANDLED; |
1644 } |
1646 } |
1645 |
1647 |
1646 if (napi_schedule_prep(&adapter->napi)) { |
1648 if (napi_schedule_prep(&adapter->napi)) { |
1647 adapter->total_tx_bytes = 0; |
1649 adapter->total_tx_bytes = 0; |
1717 writel(1000000000 / (adapter->rx_ring->itr_val * 256), |
1719 writel(1000000000 / (adapter->rx_ring->itr_val * 256), |
1718 adapter->hw.hw_addr + adapter->rx_ring->itr_register); |
1720 adapter->hw.hw_addr + adapter->rx_ring->itr_register); |
1719 adapter->rx_ring->set_itr = 0; |
1721 adapter->rx_ring->set_itr = 0; |
1720 } |
1722 } |
1721 |
1723 |
1722 if (adapter->ecdev) { |
1724 if (adapter->ecdev) { |
1723 int ec_work_done = 0; |
1725 int ec_work_done = 0; |
1724 adapter->clean_rx(adapter, &ec_work_done, 100); |
1726 adapter->clean_rx(adapter, &ec_work_done, 100); |
1725 } else { |
1727 } else { |
1726 if (napi_schedule_prep(&adapter->napi)) { |
1728 if (napi_schedule_prep(&adapter->napi)) { |
1727 adapter->total_rx_bytes = 0; |
1729 adapter->total_rx_bytes = 0; |
1728 adapter->total_rx_packets = 0; |
1730 adapter->total_rx_packets = 0; |
1729 __napi_schedule(&adapter->napi); |
1731 __napi_schedule(&adapter->napi); |
3268 |
3270 |
3269 clear_bit(__E1000_DOWN, &adapter->state); |
3271 clear_bit(__E1000_DOWN, &adapter->state); |
3270 |
3272 |
3271 if (!adapter->ecdev) { |
3273 if (!adapter->ecdev) { |
3272 napi_enable(&adapter->napi); |
3274 napi_enable(&adapter->napi); |
3273 } |
3275 } |
3274 |
3276 |
3275 if (adapter->msix_entries) |
3277 if (adapter->msix_entries) |
3276 e1000_configure_msix(adapter); |
3278 e1000_configure_msix(adapter); |
3277 if (!adapter->ecdev) { |
3279 if (!adapter->ecdev) { |
3278 e1000_irq_enable(adapter); |
3280 e1000_irq_enable(adapter); |
3279 |
3281 |
3280 netif_wake_queue(adapter->netdev); |
3282 netif_wake_queue(adapter->netdev); |
3281 |
3283 |
3282 /* fire a link change interrupt to start the watchdog */ |
3284 /* fire a link change interrupt to start the watchdog */ |
3283 if (adapter->msix_entries) |
3285 if (adapter->msix_entries) |
3284 ew32(ICS, E1000_ICS_LSC | E1000_ICR_OTHER); |
3286 ew32(ICS, E1000_ICS_LSC | E1000_ICR_OTHER); |
3285 else |
3287 else |
3286 ew32(ICS, E1000_ICS_LSC); |
3288 ew32(ICS, E1000_ICS_LSC); |
3287 } |
3289 } |
3288 |
3290 |
3289 return 0; |
3291 return 0; |
3290 } |
3292 } |
3291 |
3293 |
3304 /* disable receives in the hardware */ |
3306 /* disable receives in the hardware */ |
3305 rctl = er32(RCTL); |
3307 rctl = er32(RCTL); |
3306 ew32(RCTL, rctl & ~E1000_RCTL_EN); |
3308 ew32(RCTL, rctl & ~E1000_RCTL_EN); |
3307 /* flush and sleep below */ |
3309 /* flush and sleep below */ |
3308 |
3310 |
3309 if (!adapter->ecdev) |
3311 if (!adapter->ecdev) |
3310 netif_stop_queue(netdev); |
3312 netif_stop_queue(netdev); |
3311 |
3313 |
3312 /* disable transmits in the hardware */ |
3314 /* disable transmits in the hardware */ |
3313 tctl = er32(TCTL); |
3315 tctl = er32(TCTL); |
3314 tctl &= ~E1000_TCTL_EN; |
3316 tctl &= ~E1000_TCTL_EN; |
3607 } |
3609 } |
3608 |
3610 |
3609 /* From here on the code is the same as e1000e_up() */ |
3611 /* From here on the code is the same as e1000e_up() */ |
3610 clear_bit(__E1000_DOWN, &adapter->state); |
3612 clear_bit(__E1000_DOWN, &adapter->state); |
3611 |
3613 |
3612 napi_enable(&adapter->napi); |
3614 if (!adapter->ecdev) { |
3613 |
3615 napi_enable(&adapter->napi); |
3614 e1000_irq_enable(adapter); |
3616 |
3615 |
3617 e1000_irq_enable(adapter); |
3616 netif_start_queue(netdev); |
3618 |
|
3619 netif_start_queue(netdev); |
|
3620 } |
3617 |
3621 |
3618 adapter->idle_check = true; |
3622 adapter->idle_check = true; |
3619 pm_runtime_put(&pdev->dev); |
3623 pm_runtime_put(&pdev->dev); |
3620 |
3624 |
3621 /* fire a link status change interrupt to start the watchdog */ |
3625 /* fire a link status change interrupt to start the watchdog */ |
4029 u32 link, tctl; |
4033 u32 link, tctl; |
4030 int tx_pending = 0; |
4034 int tx_pending = 0; |
4031 |
4035 |
4032 link = e1000e_has_link(adapter); |
4036 link = e1000e_has_link(adapter); |
4033 if ((adapter->ecdev && (ecdev_get_link(adapter->ecdev)) && link) |
4037 if ((adapter->ecdev && (ecdev_get_link(adapter->ecdev)) && link) |
4034 || (!adapter->ecdev && (netif_carrier_ok(netdev)) && link)) { |
4038 || (!adapter->ecdev && (netif_carrier_ok(netdev)) && link)) { |
4035 /* Cancel scheduled suspend requests. */ |
4039 /* Cancel scheduled suspend requests. */ |
4036 pm_runtime_resume(netdev->dev.parent); |
4040 pm_runtime_resume(netdev->dev.parent); |
4037 |
4041 |
4038 e1000e_enable_receives(adapter); |
4042 e1000e_enable_receives(adapter); |
4039 goto link_up; |
4043 goto link_up; |
4042 if ((e1000e_enable_tx_pkt_filtering(hw)) && |
4046 if ((e1000e_enable_tx_pkt_filtering(hw)) && |
4043 (adapter->mng_vlan_id != adapter->hw.mng_cookie.vlan_id)) |
4047 (adapter->mng_vlan_id != adapter->hw.mng_cookie.vlan_id)) |
4044 e1000_update_mng_vlan(adapter); |
4048 e1000_update_mng_vlan(adapter); |
4045 |
4049 |
4046 if (link) { |
4050 if (link) { |
4047 if ((adapter->ecdev && !ecdev_get_link(adapter->ecdev)) |
4051 if ((adapter->ecdev && !ecdev_get_link(adapter->ecdev)) |
4048 || (!adapter->ecdev && !netif_carrier_ok(netdev))) { |
4052 || (!adapter->ecdev && !netif_carrier_ok(netdev))) { |
4049 bool txb2b = 1; |
4053 bool txb2b = 1; |
4050 |
4054 |
4051 /* Cancel scheduled suspend requests. */ |
4055 /* Cancel scheduled suspend requests. */ |
4052 pm_runtime_resume(netdev->dev.parent); |
4056 pm_runtime_resume(netdev->dev.parent); |
4140 if (phy->ops.cfg_on_link_up) |
4144 if (phy->ops.cfg_on_link_up) |
4141 phy->ops.cfg_on_link_up(hw); |
4145 phy->ops.cfg_on_link_up(hw); |
4142 |
4146 |
4143 if (adapter->ecdev) |
4147 if (adapter->ecdev) |
4144 ecdev_set_link(adapter->ecdev, 1); |
4148 ecdev_set_link(adapter->ecdev, 1); |
4145 else |
4149 else |
4146 netif_carrier_on(netdev); |
4150 netif_carrier_on(netdev); |
4147 |
4151 |
4148 if (!adapter->ecdev && !test_bit(__E1000_DOWN, &adapter->state)) |
4152 if (!adapter->ecdev && !test_bit(__E1000_DOWN, &adapter->state)) |
4149 mod_timer(&adapter->phy_info_timer, |
4153 mod_timer(&adapter->phy_info_timer, |
4150 round_jiffies(jiffies + 2 * HZ)); |
4154 round_jiffies(jiffies + 2 * HZ)); |
4151 } |
4155 } |
4152 } else { |
4156 } else { |
4153 if ((adapter->ecdev && ecdev_get_link(adapter->ecdev)) |
4157 if ((adapter->ecdev && ecdev_get_link(adapter->ecdev)) |
4154 || (!adapter->ecdev && netif_carrier_ok(netdev))) { |
4158 || (!adapter->ecdev && netif_carrier_ok(netdev))) { |
4155 adapter->link_speed = 0; |
4159 adapter->link_speed = 0; |
4156 adapter->link_duplex = 0; |
4160 adapter->link_duplex = 0; |
4157 /* Link status message must follow this format */ |
4161 /* Link status message must follow this format */ |
4158 printk(KERN_INFO "e1000e: %s NIC Link is Down\n", |
4162 printk(KERN_INFO "e1000e: %s NIC Link is Down\n", |
4186 adapter->gotc = adapter->stats.gotc - adapter->gotc_old; |
4190 adapter->gotc = adapter->stats.gotc - adapter->gotc_old; |
4187 adapter->gotc_old = adapter->stats.gotc; |
4191 adapter->gotc_old = adapter->stats.gotc; |
4188 |
4192 |
4189 e1000e_update_adaptive(&adapter->hw); |
4193 e1000e_update_adaptive(&adapter->hw); |
4190 |
4194 |
4191 if ((adapter->ecdev && !ecdev_get_link(adapter->ecdev)) |
4195 if (!adapter->ecdev && !netif_carrier_ok(netdev)) { |
4192 || (!adapter->ecdev && !netif_carrier_ok(netdev))) { |
|
4193 tx_pending = (e1000_desc_unused(tx_ring) + 1 < |
4196 tx_pending = (e1000_desc_unused(tx_ring) + 1 < |
4194 tx_ring->count); |
4197 tx_ring->count); |
4195 if (tx_pending) { |
4198 if (tx_pending) { |
4196 /* |
4199 /* |
4197 * We've lost link, so the controller stops DMA, |
4200 * We've lost link, so the controller stops DMA, |
4586 } |
4589 } |
4587 |
4590 |
4588 static int __e1000_maybe_stop_tx(struct net_device *netdev, int size) |
4591 static int __e1000_maybe_stop_tx(struct net_device *netdev, int size) |
4589 { |
4592 { |
4590 struct e1000_adapter *adapter = netdev_priv(netdev); |
4593 struct e1000_adapter *adapter = netdev_priv(netdev); |
|
4594 |
|
4595 if (adapter->ecdev) { |
|
4596 return -EBUSY; |
|
4597 } |
4591 |
4598 |
4592 netif_stop_queue(netdev); |
4599 netif_stop_queue(netdev); |
4593 /* |
4600 /* |
4594 * Herbert's original patch had: |
4601 * Herbert's original patch had: |
4595 * smp_mb__after_netif_stop_queue(); |
4602 * smp_mb__after_netif_stop_queue(); |
5275 int retval; |
5282 int retval; |
5276 bool wake; |
5283 bool wake; |
5277 struct net_device *netdev = pci_get_drvdata(pdev); |
5284 struct net_device *netdev = pci_get_drvdata(pdev); |
5278 struct e1000_adapter *adapter = netdev_priv(netdev); |
5285 struct e1000_adapter *adapter = netdev_priv(netdev); |
5279 |
5286 |
5280 if (adapter->ecdev) { |
5287 if (adapter->ecdev) { |
5281 return -EBUSY; |
5288 return -EBUSY; |
5282 } |
5289 } |
5283 |
5290 |
5284 retval = __e1000_shutdown(pdev, &wake, false); |
5291 retval = __e1000_shutdown(pdev, &wake, false); |
5285 if (!retval) |
5292 if (!retval) |
5286 e1000_complete_shutdown(pdev, true, wake); |
5293 e1000_complete_shutdown(pdev, true, wake); |
5287 |
5294 |
5292 { |
5299 { |
5293 struct pci_dev *pdev = to_pci_dev(dev); |
5300 struct pci_dev *pdev = to_pci_dev(dev); |
5294 struct net_device *netdev = pci_get_drvdata(pdev); |
5301 struct net_device *netdev = pci_get_drvdata(pdev); |
5295 struct e1000_adapter *adapter = netdev_priv(netdev); |
5302 struct e1000_adapter *adapter = netdev_priv(netdev); |
5296 |
5303 |
5297 if (adapter->ecdev) { |
5304 if (adapter->ecdev) { |
5298 return -EBUSY; |
5305 return -EBUSY; |
5299 } |
5306 } |
5300 |
5307 |
5301 if (e1000e_pm_ready(adapter)) |
5308 if (e1000e_pm_ready(adapter)) |
5302 adapter->idle_check = true; |
5309 adapter->idle_check = true; |
5303 |
5310 |
5304 return __e1000_resume(pdev); |
5311 return __e1000_resume(pdev); |
5357 static void e1000_shutdown(struct pci_dev *pdev) |
5364 static void e1000_shutdown(struct pci_dev *pdev) |
5358 { |
5365 { |
5359 bool wake = false; |
5366 bool wake = false; |
5360 struct net_device *netdev = pci_get_drvdata(pdev); |
5367 struct net_device *netdev = pci_get_drvdata(pdev); |
5361 struct e1000_adapter *adapter = netdev_priv(netdev); |
5368 struct e1000_adapter *adapter = netdev_priv(netdev); |
5362 |
5369 |
5363 if (adapter->ecdev) |
5370 if (adapter->ecdev) |
5364 return; |
5371 return; |
5365 |
5372 |
5366 __e1000_shutdown(pdev, &wake, false); |
5373 __e1000_shutdown(pdev, &wake, false); |
5367 |
5374 |
5854 if (!(adapter->flags & FLAG_HAS_AMT)) |
5861 if (!(adapter->flags & FLAG_HAS_AMT)) |
5855 e1000_get_hw_control(adapter); |
5862 e1000_get_hw_control(adapter); |
5856 |
5863 |
5857 adapter->ecdev = ecdev_offer(netdev,ec_poll,THIS_MODULE); |
5864 adapter->ecdev = ecdev_offer(netdev,ec_poll,THIS_MODULE); |
5858 if (adapter->ecdev) { |
5865 if (adapter->ecdev) { |
5859 if (ecdev_open(adapter->ecdev)) { |
5866 err = ecdev_open(adapter->ecdev); |
|
5867 if (err) { |
5860 ecdev_withdraw(adapter->ecdev); |
5868 ecdev_withdraw(adapter->ecdev); |
5861 goto err_register; |
5869 goto err_register; |
5862 } |
5870 } |
5863 } else { |
5871 } else { |
5864 strcpy(netdev->name, "eth%d"); |
5872 strcpy(netdev->name, "eth%d"); |