devices/e1000e/netdev-2.6.37-ethercat.c
changeset 2589 2b9c78543663
parent 2239 fb6ec8610ada
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 
  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;