devices/e1000e/netdev-2.6.35-ethercat.c
changeset 2589 2b9c78543663
parent 2285 8ebecea534d3
equal deleted inserted replaced
2415:af21f0bdc7c9 2589:2b9c78543663
    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");