devices/e1000e/netdev-3.2-ethercat.c
branchstable-1.5
changeset 2473 f62b64fdbc23
parent 2472 50b861e981f7
child 2496 28f1e9e93a1d
equal deleted inserted replaced
2472:50b861e981f7 2473:f62b64fdbc23
    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 
   982 			ecdev_receive(adapter->ecdev, skb->data, length);
   984 			ecdev_receive(adapter->ecdev, skb->data, length);
   983 			adapter->ec_watchdog_jiffies = jiffies;
   985 			adapter->ec_watchdog_jiffies = jiffies;
   984 		} else {
   986 		} else {
   985 		    e1000_receive_skb(adapter, netdev, skb, staterr,
   987 		    e1000_receive_skb(adapter, netdev, skb, staterr,
   986 				      rx_desc->wb.upper.vlan);
   988 				      rx_desc->wb.upper.vlan);
   987         }
   989 		}
   988 
   990 
   989 next_desc:
   991 next_desc:
   990 		rx_desc->wb.upper.status_error &= cpu_to_le32(~0xFF);
   992 		rx_desc->wb.upper.status_error &= cpu_to_le32(~0xFF);
   991 
   993 
   992 		/* return some buffers to hardware, one at a time is too slow */
   994 		/* return some buffers to hardware, one at a time is too slow */
  1063 		adapter->tx_hang_recheck = true;
  1065 		adapter->tx_hang_recheck = true;
  1064 		return;
  1066 		return;
  1065 	}
  1067 	}
  1066 	/* Real hang detected */
  1068 	/* Real hang detected */
  1067 	adapter->tx_hang_recheck = false;
  1069 	adapter->tx_hang_recheck = false;
  1068 	netif_stop_queue(netdev);
  1070 	if (!adapter->ecdev) {
       
  1071 		netif_stop_queue(netdev);
       
  1072 	}
  1069 
  1073 
  1070 	e1e_rphy(hw, PHY_STATUS, &phy_status);
  1074 	e1e_rphy(hw, PHY_STATUS, &phy_status);
  1071 	e1e_rphy(hw, PHY_1000T_STATUS, &phy_1000t_status);
  1075 	e1e_rphy(hw, PHY_1000T_STATUS, &phy_1000t_status);
  1072 	e1e_rphy(hw, PHY_EXT_STATUS, &phy_ext_status);
  1076 	e1e_rphy(hw, PHY_EXT_STATUS, &phy_ext_status);
  1073 
  1077 
  1662 	struct net_device *netdev = data;
  1666 	struct net_device *netdev = data;
  1663 	struct e1000_adapter *adapter = netdev_priv(netdev);
  1667 	struct e1000_adapter *adapter = netdev_priv(netdev);
  1664 	struct e1000_hw *hw = &adapter->hw;
  1668 	struct e1000_hw *hw = &adapter->hw;
  1665 	u32 icr = er32(ICR);
  1669 	u32 icr = er32(ICR);
  1666 
  1670 
  1667  	if (adapter->ecdev) {
  1671 	if (adapter->ecdev) {
  1668  		int ec_work_done = 0;
  1672 		int ec_work_done = 0;
  1669  		adapter->clean_rx(adapter, &ec_work_done, 100);
  1673 		adapter->clean_rx(adapter, &ec_work_done, 100);
  1670  		e1000_clean_tx_irq(adapter);
  1674 		e1000_clean_tx_irq(adapter);
  1671 		return IRQ_HANDLED;
  1675 		return IRQ_HANDLED;
  1672 	}
  1676 	}
  1673 	/*
  1677 	/*
  1674 	 * read ICR disables interrupts using IAM
  1678 	 * read ICR disables interrupts using IAM
  1675 	 */
  1679 	 */
  1766 		/* guard against interrupt when we're going down */
  1770 		/* guard against interrupt when we're going down */
  1767 		if (!test_bit(__E1000_DOWN, &adapter->state))
  1771 		if (!test_bit(__E1000_DOWN, &adapter->state))
  1768 			mod_timer(&adapter->watchdog_timer, jiffies + 1);
  1772 			mod_timer(&adapter->watchdog_timer, jiffies + 1);
  1769 	}
  1773 	}
  1770 
  1774 
  1771  	if (adapter->ecdev) {
  1775 	if (adapter->ecdev) {
  1772  		int ec_work_done = 0;
  1776 		int ec_work_done = 0;
  1773  		adapter->clean_rx(adapter, &ec_work_done, 100);
  1777 		adapter->clean_rx(adapter, &ec_work_done, 100);
  1774  		e1000_clean_tx_irq(adapter);
  1778 		e1000_clean_tx_irq(adapter);
  1775 		return IRQ_HANDLED;
  1779 		return IRQ_HANDLED;
  1776 	}
  1780 	}
  1777 
  1781 
  1778 	if (napi_schedule_prep(&adapter->napi)) {
  1782 	if (napi_schedule_prep(&adapter->napi)) {
  1779 		adapter->total_tx_bytes = 0;
  1783 		adapter->total_tx_bytes = 0;
  1849 		writel(1000000000 / (adapter->rx_ring->itr_val * 256),
  1853 		writel(1000000000 / (adapter->rx_ring->itr_val * 256),
  1850 		       adapter->hw.hw_addr + adapter->rx_ring->itr_register);
  1854 		       adapter->hw.hw_addr + adapter->rx_ring->itr_register);
  1851 		adapter->rx_ring->set_itr = 0;
  1855 		adapter->rx_ring->set_itr = 0;
  1852 	}
  1856 	}
  1853 
  1857 
  1854  	if (adapter->ecdev) {
  1858 	if (adapter->ecdev) {
  1855  		int ec_work_done = 0;
  1859 		int ec_work_done = 0;
  1856  		adapter->clean_rx(adapter, &ec_work_done, 100);
  1860 		adapter->clean_rx(adapter, &ec_work_done, 100);
  1857 	} else {
  1861 	} else {
  1858 		if (napi_schedule_prep(&adapter->napi)) {
  1862 		if (napi_schedule_prep(&adapter->napi)) {
  1859 			adapter->total_rx_bytes = 0;
  1863 			adapter->total_rx_bytes = 0;
  1860 			adapter->total_rx_packets = 0;
  1864 			adapter->total_rx_packets = 0;
  1861 			__napi_schedule(&adapter->napi);
  1865 			__napi_schedule(&adapter->napi);
  3869 
  3873 
  3870 	if (!adapter->ecdev) {
  3874 	if (!adapter->ecdev) {
  3871 		napi_enable(&adapter->napi);
  3875 		napi_enable(&adapter->napi);
  3872 
  3876 
  3873 		e1000_irq_enable(adapter);
  3877 		e1000_irq_enable(adapter);
       
  3878 	}
  3874 
  3879 
  3875 	adapter->tx_hang_recheck = false;
  3880 	adapter->tx_hang_recheck = false;
       
  3881 
       
  3882 	if (!adapter->ecdev) {
  3876 		netif_start_queue(netdev);
  3883 		netif_start_queue(netdev);
  3877 
  3884 	}
  3878 		adapter->idle_check = true;
  3885 
  3879 		pm_runtime_put(&pdev->dev);
  3886 	adapter->idle_check = true;
  3880 
  3887 	pm_runtime_put(&pdev->dev);
  3881 		/* fire a link status change interrupt to start the watchdog */
  3888 
  3882 		if (adapter->msix_entries)
  3889 	/* fire a link status change interrupt to start the watchdog */
  3883 			ew32(ICS, E1000_ICS_LSC | E1000_ICR_OTHER);
  3890 	if (adapter->msix_entries)
  3884 		else
  3891 		ew32(ICS, E1000_ICS_LSC | E1000_ICR_OTHER);
  3885 			ew32(ICS, E1000_ICS_LSC);
  3892 	else
  3886 	}
  3893 		ew32(ICS, E1000_ICS_LSC);
  3887 
  3894 
  3888 	return 0;
  3895 	return 0;
  3889 
  3896 
  3890 err_req_irq:
  3897 err_req_irq:
  3891 	e1000e_release_hw_control(adapter);
  3898 	e1000e_release_hw_control(adapter);