Commit 74ef9c39 authored by Jesse Brandeburg's avatar Jesse Brandeburg Committed by Jeff Garzik
Browse files

e1000e: remove irq_sem



irq_sem can safely be removed by auditing all irq.*able sites to
make sure that interrupts don't get enabled unexpectedly when the
interface is down.

Signed-off-by: default avatarJesse Brandeburg <jesse.brandeburg@intel.com>
Signed-off-by: default avatarAuke Kok <auke-jan.h.kok@intel.com>
Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
parent 67d204a5
Loading
Loading
Loading
Loading
+0 −3
Original line number Diff line number Diff line
@@ -167,9 +167,6 @@ struct e1000_adapter {

	spinlock_t tx_queue_lock; /* prevent concurrent tail updates */

	/* this is still needed for 82571 and above */
	atomic_t irq_sem;

	/* track device up/down/testing state */
	unsigned long state;

+14 −23
Original line number Diff line number Diff line
@@ -836,9 +836,7 @@ static irqreturn_t e1000_intr_msi(int irq, void *data)
	struct e1000_hw *hw = &adapter->hw;
	u32 icr = er32(ICR);

	/* read ICR disables interrupts using IAM, so keep up with our
	 * enable/disable accounting */
	atomic_inc(&adapter->irq_sem);
	/* read ICR disables interrupts using IAM */

	if (icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC)) {
		hw->mac.get_link_status = 1;
@@ -868,8 +866,6 @@ static irqreturn_t e1000_intr_msi(int irq, void *data)
		adapter->total_rx_bytes = 0;
		adapter->total_rx_packets = 0;
		__netif_rx_schedule(netdev, &adapter->napi);
	} else {
		atomic_dec(&adapter->irq_sem);
	}

	return IRQ_HANDLED;
@@ -895,11 +891,8 @@ static irqreturn_t e1000_intr(int irq, void *data)
	if (!(icr & E1000_ICR_INT_ASSERTED))
		return IRQ_NONE;

	/* Interrupt Auto-Mask...upon reading ICR,
	 * interrupts are masked.  No need for the
	 * IMC write, but it does mean we should
	 * account for it ASAP. */
	atomic_inc(&adapter->irq_sem);
	/* Interrupt Auto-Mask...upon reading ICR, interrupts are masked.  No
	 * need for the IMC write */

	if (icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC)) {
		hw->mac.get_link_status = 1;
@@ -931,8 +924,6 @@ static irqreturn_t e1000_intr(int irq, void *data)
		adapter->total_rx_bytes = 0;
		adapter->total_rx_packets = 0;
		__netif_rx_schedule(netdev, &adapter->napi);
	} else {
		atomic_dec(&adapter->irq_sem);
	}

	return IRQ_HANDLED;
@@ -983,7 +974,6 @@ static void e1000_irq_disable(struct e1000_adapter *adapter)
{
	struct e1000_hw *hw = &adapter->hw;

	atomic_inc(&adapter->irq_sem);
	ew32(IMC, ~0);
	e1e_flush();
	synchronize_irq(adapter->pdev->irq);
@@ -996,11 +986,9 @@ static void e1000_irq_enable(struct e1000_adapter *adapter)
{
	struct e1000_hw *hw = &adapter->hw;

	if (atomic_dec_and_test(&adapter->irq_sem)) {
	ew32(IMS, IMS_ENABLE_MASK);
	e1e_flush();
}
}

/**
 * e1000_get_hw_control - get control of the h/w from f/w
@@ -1427,8 +1415,11 @@ static void e1000_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
	struct e1000_hw *hw = &adapter->hw;
	u32 vfta, index;

	if (!test_bit(__E1000_DOWN, &adapter->state))
		e1000_irq_disable(adapter);
	vlan_group_set_device(adapter->vlgrp, vid, NULL);

	if (!test_bit(__E1000_DOWN, &adapter->state))
		e1000_irq_enable(adapter);

	if ((adapter->hw.mng_cookie.status &
@@ -1480,6 +1471,7 @@ static void e1000_vlan_rx_register(struct net_device *netdev,
	struct e1000_hw *hw = &adapter->hw;
	u32 ctrl, rctl;

	if (!test_bit(__E1000_DOWN, &adapter->state))
		e1000_irq_disable(adapter);
	adapter->vlgrp = grp;

@@ -1517,6 +1509,7 @@ static void e1000_vlan_rx_register(struct net_device *netdev,
		}
	}

	if (!test_bit(__E1000_DOWN, &adapter->state))
		e1000_irq_enable(adapter);
}

@@ -2167,7 +2160,6 @@ void e1000e_down(struct e1000_adapter *adapter)
	msleep(10);

	napi_disable(&adapter->napi);
	atomic_set(&adapter->irq_sem, 0);
	e1000_irq_disable(adapter);

	del_timer_sync(&adapter->watchdog_timer);
@@ -2227,7 +2219,6 @@ static int __devinit e1000_sw_init(struct e1000_adapter *adapter)
	spin_lock_init(&adapter->tx_queue_lock);

	/* Explicitly disable IRQ since the NIC can be in any state. */
	atomic_set(&adapter->irq_sem, 0);
	e1000_irq_disable(adapter);

	spin_lock_init(&adapter->stats_lock);