Thread (19 messages) 19 messages, 7 authors, 2013-05-29

Re: [PATCH net-next 1/4] igb: refactor and simplify time sync interrupt handling

From: Vick, Matthew <hidden>
Date: 2013-05-28 15:24:10

On 5/27/13 2:21 AM, "Richard Cochran" [off-list ref] wrote:
quoted hunk ↗ jump to hunk
The code that handles the time sync interrupt is repeated in three
different places. This patch refactors the identical code blocks into
a single helper function. Also, reading the TSICR register already
acknowledges the time sync interrupts, and so there is no need to
write that register at all.

Signed-off-by: Richard Cochran <richardcochran@gmail.com>
---
drivers/net/ethernet/intel/igb/igb_main.c |   47
+++++++++++------------------
1 file changed, 17 insertions(+), 30 deletions(-)
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c
b/drivers/net/ethernet/intel/igb/igb_main.c
index 6a0c1b6..d25a965 100644
--- a/drivers/net/ethernet/intel/igb/igb_main.c
+++ b/drivers/net/ethernet/intel/igb/igb_main.c
@@ -5035,6 +5035,17 @@ void igb_update_stats(struct igb_adapter *adapter,
	}
}

+static void igb_tsync_interrupt(struct igb_adapter *adapter)
+{
+	struct e1000_hw *hw = &adapter->hw;
+	u32 tsicr = rd32(E1000_TSICR);
+
+	if (tsicr & E1000_TSICR_TXTS) {
+		/* retrieve hardware timestamp */
+		schedule_work(&adapter->ptp_tx_work);
+	}
+}
+
static irqreturn_t igb_msix_other(int irq, void *data)
{
	struct igb_adapter *adapter = data;
@@ -5066,16 +5077,8 @@ static irqreturn_t igb_msix_other(int irq, void
*data)
			mod_timer(&adapter->watchdog_timer, jiffies + 1);
	}

-	if (icr & E1000_ICR_TS) {
-		u32 tsicr = rd32(E1000_TSICR);
-
-		if (tsicr & E1000_TSICR_TXTS) {
-			/* acknowledge the interrupt */
-			wr32(E1000_TSICR, E1000_TSICR_TXTS);
-			/* retrieve hardware timestamp */
-			schedule_work(&adapter->ptp_tx_work);
-		}
-	}
+	if (icr & E1000_ICR_TS)
+		igb_tsync_interrupt(adapter);

	wr32(E1000_EIMS, adapter->eims_other);
@@ -5850,16 +5853,8 @@ static irqreturn_t igb_intr_msi(int irq, void
*data)
			mod_timer(&adapter->watchdog_timer, jiffies + 1);
	}

-	if (icr & E1000_ICR_TS) {
-		u32 tsicr = rd32(E1000_TSICR);
-
-		if (tsicr & E1000_TSICR_TXTS) {
-			/* acknowledge the interrupt */
-			wr32(E1000_TSICR, E1000_TSICR_TXTS);
-			/* retrieve hardware timestamp */
-			schedule_work(&adapter->ptp_tx_work);
-		}
-	}
+	if (icr & E1000_ICR_TS)
+		igb_tsync_interrupt(adapter);

	napi_schedule(&q_vector->napi);
@@ -5904,16 +5899,8 @@ static irqreturn_t igb_intr(int irq, void *data)
			mod_timer(&adapter->watchdog_timer, jiffies + 1);
	}

-	if (icr & E1000_ICR_TS) {
-		u32 tsicr = rd32(E1000_TSICR);
-
-		if (tsicr & E1000_TSICR_TXTS) {
-			/* acknowledge the interrupt */
-			wr32(E1000_TSICR, E1000_TSICR_TXTS);
-			/* retrieve hardware timestamp */
-			schedule_work(&adapter->ptp_tx_work);
-		}
-	}
+	if (icr & E1000_ICR_TS)
+		igb_tsync_interrupt(adapter);

	napi_schedule(&q_vector->napi);

-- 
1.7.10.4
NAK due to the question you raised in the other thread--this will break
1588 on the 82580, but there was really no way for you to know that. As I
mentioned before, I'm getting the internal discussion going to confirm
that.

Matthew
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help