devices/e1000e/netdev-3.4-ethercat.c
branchstable-1.5
changeset 2497 505cf41488a4
parent 2492 d7b1a62709af
child 2500 97fd83907c7c
equal deleted inserted replaced
2496:28f1e9e93a1d 2497:505cf41488a4
  2154  **/
  2154  **/
  2155 static void e1000_irq_disable(struct e1000_adapter *adapter)
  2155 static void e1000_irq_disable(struct e1000_adapter *adapter)
  2156 {
  2156 {
  2157 	struct e1000_hw *hw = &adapter->hw;
  2157 	struct e1000_hw *hw = &adapter->hw;
  2158 
  2158 
  2159 	if (adapter->ecdev)
       
  2160 		return;
       
  2161 
       
  2162 	ew32(IMC, ~0);
  2159 	ew32(IMC, ~0);
  2163 	if (adapter->msix_entries)
  2160 	if (adapter->msix_entries)
  2164 		ew32(EIAC_82574, 0);
  2161 		ew32(EIAC_82574, 0);
  2165 	e1e_flush();
  2162 	e1e_flush();
       
  2163 
       
  2164 	if (adapter->ecdev) {
       
  2165 		return;
       
  2166 	}
  2166 
  2167 
  2167 	if (adapter->msix_entries) {
  2168 	if (adapter->msix_entries) {
  2168 		int i;
  2169 		int i;
  2169 		for (i = 0; i < adapter->num_vectors; i++)
  2170 		for (i = 0; i < adapter->num_vectors; i++)
  2170 			synchronize_irq(adapter->msix_entries[i].vector);
  2171 			synchronize_irq(adapter->msix_entries[i].vector);
  3643 	/* hardware has been reset, we need to reload some things */
  3644 	/* hardware has been reset, we need to reload some things */
  3644 	e1000_configure(adapter);
  3645 	e1000_configure(adapter);
  3645 
  3646 
  3646 	clear_bit(__E1000_DOWN, &adapter->state);
  3647 	clear_bit(__E1000_DOWN, &adapter->state);
  3647 
  3648 
  3648 	if (adapter->msix_entries)
       
  3649 		e1000_configure_msix(adapter);
       
  3650 
       
  3651 	if (!adapter->ecdev) {
  3649 	if (!adapter->ecdev) {
       
  3650 		if (adapter->msix_entries)
       
  3651 			e1000_configure_msix(adapter);
       
  3652 
  3652 		e1000_irq_enable(adapter);
  3653 		e1000_irq_enable(adapter);
  3653 
  3654 
  3654 		netif_start_queue(adapter->netdev);
  3655 		netif_start_queue(adapter->netdev);
  3655 
  3656 
  3656 		/* fire a link change interrupt to start the watchdog */
  3657 		/* fire a link change interrupt to start the watchdog */
  3991 	/*
  3992 	/*
  3992 	 * Work around PCIe errata with MSI interrupts causing some chipsets to
  3993 	 * Work around PCIe errata with MSI interrupts causing some chipsets to
  3993 	 * ignore e1000e MSI messages, which means we need to test our MSI
  3994 	 * ignore e1000e MSI messages, which means we need to test our MSI
  3994 	 * interrupt now
  3995 	 * interrupt now
  3995 	 */
  3996 	 */
  3996 	if (adapter->int_mode != E1000E_INT_MODE_LEGACY) {
  3997 	if (!adapter->ecdev && adapter->int_mode != E1000E_INT_MODE_LEGACY) {
  3997 		err = e1000_test_msi(adapter);
  3998 		err = e1000_test_msi(adapter);
  3998 		if (err) {
  3999 		if (err) {
  3999 			e_err("Interrupt allocation failed\n");
  4000 			e_err("Interrupt allocation failed\n");
  4000 			goto err_req_irq;
  4001 			goto err_req_irq;
  4001 		}
  4002 		}
  4643 			adapter->link_speed = 0;
  4644 			adapter->link_speed = 0;
  4644 			adapter->link_duplex = 0;
  4645 			adapter->link_duplex = 0;
  4645 			/* Link status message must follow this format */
  4646 			/* Link status message must follow this format */
  4646 			printk(KERN_INFO "e1000e: %s NIC Link is Down\n",
  4647 			printk(KERN_INFO "e1000e: %s NIC Link is Down\n",
  4647 			       adapter->netdev->name);
  4648 			       adapter->netdev->name);
  4648 			if (adapter->ecdev)
  4649 			if (adapter->ecdev) {
  4649 				ecdev_set_link(adapter->ecdev, 0);
  4650 				ecdev_set_link(adapter->ecdev, 0);
  4650 			else
  4651 			}
       
  4652 			else {
  4651 				netif_carrier_off(netdev);
  4653 				netif_carrier_off(netdev);
  4652 			if (!adapter->ecdev && !test_bit(__E1000_DOWN, &adapter->state))
  4654 				if (!test_bit(__E1000_DOWN, &adapter->state))
  4653 				mod_timer(&adapter->phy_info_timer,
  4655 					mod_timer(&adapter->phy_info_timer,
  4654 					  round_jiffies(jiffies + 2 * HZ));
  4656 							round_jiffies(jiffies + 2 * HZ));
       
  4657 			}
  4655 
  4658 
  4656 			if (adapter->flags & FLAG_RX_NEEDS_RESTART)
  4659 			if (adapter->flags & FLAG_RX_NEEDS_RESTART)
  4657 				schedule_work(&adapter->reset_task);
  4660 				schedule_work(&adapter->reset_task);
  4658 			else
  4661 			else
  4659 				pm_schedule_suspend(netdev->dev.parent,
  4662 				pm_schedule_suspend(netdev->dev.parent,
  4660 							LINK_TIMEOUT);
  4663 						LINK_TIMEOUT);
  4661 		}
  4664 		}
  4662 	}
  4665 	}
  4663 
  4666 
  4664 link_up:
  4667 link_up:
  4665 	spin_lock(&adapter->stats64_lock);
  4668 	spin_lock(&adapter->stats64_lock);
  6199 void ec_poll(struct net_device *netdev)
  6202 void ec_poll(struct net_device *netdev)
  6200 {
  6203 {
  6201 	struct e1000_adapter *adapter = netdev_priv(netdev);
  6204 	struct e1000_adapter *adapter = netdev_priv(netdev);
  6202 
  6205 
  6203 	if (jiffies - adapter->ec_watchdog_jiffies >= 2 * HZ) {
  6206 	if (jiffies - adapter->ec_watchdog_jiffies >= 2 * HZ) {
  6204 		e1000_watchdog((unsigned long) adapter);
  6207 		struct e1000_hw *hw = &adapter->hw;
       
  6208 		hw->mac.get_link_status = true;
       
  6209 		e1000_watchdog_task(&adapter->watchdog_task);
  6205 		adapter->ec_watchdog_jiffies = jiffies;
  6210 		adapter->ec_watchdog_jiffies = jiffies;
  6206 	}
  6211 	}
  6207 
  6212 
  6208 #ifdef CONFIG_PCI_MSI
  6213 #ifdef CONFIG_PCI_MSI
  6209 	e1000_intr_msi(0, netdev);
  6214 	e1000_intr_msi(0, netdev);
  6512 	if (!(adapter->flags & FLAG_HAS_AMT))
  6517 	if (!(adapter->flags & FLAG_HAS_AMT))
  6513 		e1000e_get_hw_control(adapter);
  6518 		e1000e_get_hw_control(adapter);
  6514 
  6519 
  6515 	adapter->ecdev = ecdev_offer(netdev, ec_poll, THIS_MODULE);
  6520 	adapter->ecdev = ecdev_offer(netdev, ec_poll, THIS_MODULE);
  6516 	if (adapter->ecdev) {
  6521 	if (adapter->ecdev) {
       
  6522 		adapter->ec_watchdog_jiffies = jiffies;
  6517 		if (ecdev_open(adapter->ecdev)) {
  6523 		if (ecdev_open(adapter->ecdev)) {
  6518 			ecdev_withdraw(adapter->ecdev);
  6524 			ecdev_withdraw(adapter->ecdev);
  6519 			goto err_register;
  6525 			goto err_register;
  6520 		}
  6526 		}
  6521 	} else {
  6527 	} else {