All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Michael Chan" <mchan@broadcom.com>
To: "John W. Linville" <linville@tuxdriver.com>, davem@davemloft.net
Cc: netdev@oss.sgi.com
Subject: [PATCH 2.6.12-rc2 10/11] tg3: Add msi support
Date: Mon, 18 Apr 2005 00:59:29 -0700	[thread overview]
Message-ID: <1113811169.6504.80.camel@rh4> (raw)
In-Reply-To: <1113809864.6504.58.camel@rh4>

[-- Attachment #1: Type: text/plain, Size: 88 bytes --]

Add MSI support for 5751 C0 and 5752.

Signed-off-by: Michael Chan <mchan@broadcom.com>

[-- Attachment #2: tg3-110.patch --]
[-- Type: text/x-patch, Size: 3837 bytes --]

diff -Nru 109/drivers/net/tg3.c 110/drivers/net/tg3.c
--- 109/drivers/net/tg3.c	2005-04-15 21:26:02.000000000 -0700
+++ 110/drivers/net/tg3.c	2005-04-15 21:27:17.000000000 -0700
@@ -2907,6 +2907,43 @@
 	return work_exists;
 }
 
+/* MSI ISR - No need to check for interrupt sharing and no need to
+ * flush status block and interrupt mailbox. PCI ordering rules
+ * guarantee that MSI will arrive after the status block.
+ */
+static irqreturn_t tg3_msi(int irq, void *dev_id, struct pt_regs *regs)
+{
+	struct net_device *dev = dev_id;
+	struct tg3 *tp = netdev_priv(dev);
+	struct tg3_hw_status *sblk = tp->hw_status;
+	unsigned long flags;
+
+	spin_lock_irqsave(&tp->lock, flags);
+
+	/*
+	 * writing any value to intr-mbox-0 clears PCI INTA# and
+	 * chip-internal interrupt pending events.
+	 * writing non-zero to intr-mbox-0 additional tells the
+	 * NIC to stop sending us irqs, engaging "in-intr-handler"
+	 * event coalescing.
+	 */
+	tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, 0x00000001);
+	sblk->status &= ~SD_STATUS_UPDATED;
+
+	if (likely(tg3_has_work(dev, tp)))
+		netif_rx_schedule(dev);		/* schedule NAPI poll */
+	else {
+		/* no work, re-enable interrupts
+		 */
+		tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW,
+			     0x00000000);
+	}
+
+	spin_unlock_irqrestore(&tp->lock, flags);
+
+	return IRQ_RETVAL(1);
+}
+
 static irqreturn_t tg3_interrupt(int irq, void *dev_id, struct pt_regs *regs)
 {
 	struct net_device *dev = dev_id;
@@ -2965,7 +3002,9 @@
 #ifdef CONFIG_NET_POLL_CONTROLLER
 static void tg3_poll_controller(struct net_device *dev)
 {
-	tg3_interrupt(dev->irq, dev, NULL);
+	struct tg3 *tp = netdev_priv(dev);
+
+	tg3_interrupt(tp->pdev->irq, dev, NULL);
 }
 #endif
 
@@ -5778,10 +5817,29 @@
 	if (err)
 		return err;
 
-	err = request_irq(dev->irq, tg3_interrupt,
-			  SA_SHIRQ, dev->name, dev);
+	if ((tp->tg3_flags2 & TG3_FLG2_5750_PLUS) &&
+	    (GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5750_AX) &&
+	    (GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5750_BX)) {
+		if (pci_enable_msi(tp->pdev) == 0) {
+			u32 msi_mode;
+
+			msi_mode = tr32(MSGINT_MODE);
+			tw32(MSGINT_MODE, msi_mode | MSGINT_MODE_ENABLE);
+			tp->tg3_flags2 |= TG3_FLG2_USING_MSI;
+		}
+	}
+	if (tp->tg3_flags2 & TG3_FLG2_USING_MSI)
+		err = request_irq(tp->pdev->irq, tg3_msi,
+				  0, dev->name, dev);
+	else
+		err = request_irq(tp->pdev->irq, tg3_interrupt,
+				  SA_SHIRQ, dev->name, dev);
 
 	if (err) {
+		if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) {
+			pci_disable_msi(tp->pdev);
+			tp->tg3_flags2 &= ~TG3_FLG2_USING_MSI;
+		}
 		tg3_free_consistent(tp);
 		return err;
 	}
@@ -5811,7 +5869,11 @@
 	spin_unlock_irq(&tp->lock);
 
 	if (err) {
-		free_irq(dev->irq, dev);
+		free_irq(tp->pdev->irq, dev);
+		if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) {
+			pci_disable_msi(tp->pdev);
+			tp->tg3_flags2 &= ~TG3_FLG2_USING_MSI;
+		}
 		tg3_free_consistent(tp);
 		return err;
 	}
@@ -6086,7 +6148,11 @@
 	spin_unlock(&tp->tx_lock);
 	spin_unlock_irq(&tp->lock);
 
-	free_irq(dev->irq, dev);
+	free_irq(tp->pdev->irq, dev);
+	if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) {
+		pci_disable_msi(tp->pdev);
+		tp->tg3_flags2 &= ~TG3_FLG2_USING_MSI;
+	}
 
 	memcpy(&tp->net_stats_prev, tg3_get_stats(tp->dev),
 	       sizeof(tp->net_stats_prev));
diff -Nru 109/drivers/net/tg3.h 110/drivers/net/tg3.h
--- 109/drivers/net/tg3.h	2005-04-15 21:25:26.000000000 -0700
+++ 110/drivers/net/tg3.h	2005-04-15 21:27:17.000000000 -0700
@@ -2123,6 +2123,7 @@
 #define TG3_FLG2_5705_PLUS		0x00040000
 #define TG3_FLG2_5750_PLUS		0x00080000
 #define TG3_FLG2_PROTECTED_NVRAM	0x00100000
+#define TG3_FLG2_USING_MSI		0x00200000
 
 	u32				split_mode_max_reqs;
 #define SPLIT_MODE_5704_MAX_REQ		3

  parent reply	other threads:[~2005-04-18  7:59 UTC|newest]

Thread overview: 45+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-04-13 23:38 [patch 2.6.12-rc2 0/10] add bcm5752 support plus some cleanup to tg3 John W. Linville
2005-04-13 23:38 ` [patch 2.6.12-rc2 1/10] tg3: add basic bcm5752 support John W. Linville
2005-04-13 23:38   ` [patch 2.6.12-rc2 2/10] tg3: add bcm5752 to tg3_pci_tbl John W. Linville
2005-04-13 23:38     ` [patch 2.6.12-rc2 3/10] tg3: add bcm5752 entry to pci_ids.h John W. Linville
2005-04-13 23:38       ` [patch 2.6.12-rc2 4/10] tg3: use TG3_FLG2_5705_PLUS instead of multi-way if's John W. Linville
2005-04-13 23:38         ` [patch 2.6.12-rc2 5/10] tg3: define TG3_FLG2_5750_PLUS flag John W. Linville
2005-04-13 23:38           ` [patch 2.6.12-rc2 6/10] tg3: use new " John W. Linville
2005-04-13 23:38             ` [patch 2.6.12-rc2 7/10] tg3: more use of TG3_FLG2_5705_PLUS flag John W. Linville
2005-04-13 23:38               ` [patch 2.6.12-rc2 8/10] tg3: use TG3_FLG2_57{05,50}_PLUS flags in tg3_get_invariants John W. Linville
2005-04-13 23:38                 ` [patch 2.6.12-rc2 9/10] tg3: check TG3_FLG2_5750_PLUS flag to set TG3_FLG2_5705_PLUS flag John W. Linville
2005-04-13 23:38                   ` [patch 2.6.12-rc2 10/10] tg3: add support for bcm5752 rev a1 John W. Linville
2005-04-22  0:04                     ` David S. Miller
2005-04-22  0:04                   ` [patch 2.6.12-rc2 9/10] tg3: check TG3_FLG2_5750_PLUS flag to set TG3_FLG2_5705_PLUS flag David S. Miller
2005-04-22  0:03                 ` [patch 2.6.12-rc2 8/10] tg3: use TG3_FLG2_57{05,50}_PLUS flags in tg3_get_invariants David S. Miller
2005-04-22  0:02               ` [patch 2.6.12-rc2 7/10] tg3: more use of TG3_FLG2_5705_PLUS flag David S. Miller
2005-04-22  0:02             ` [patch 2.6.12-rc2 6/10] tg3: use new TG3_FLG2_5750_PLUS flag David S. Miller
2005-04-22  0:01           ` [patch 2.6.12-rc2 5/10] tg3: define " David S. Miller
2005-04-22  0:00         ` [patch 2.6.12-rc2 4/10] tg3: use TG3_FLG2_5705_PLUS instead of multi-way if's David S. Miller
2005-04-21 23:59       ` [patch 2.6.12-rc2 3/10] tg3: add bcm5752 entry to pci_ids.h David S. Miller
2005-05-27 18:47         ` [patch 2.6.12-rc5] tg3: add bcm5752 entry to pci.ids John W. Linville
2005-05-27 18:53           ` Christoph Hellwig
2005-05-27 19:00             ` John W. Linville
2005-05-27 18:12               ` Michael Chan
2005-05-27 19:02               ` Christoph Hellwig
2005-05-27 19:30           ` David S. Miller
2005-05-27 19:24             ` Michael Chan
2005-05-27 20:40               ` Jeff Garzik
2005-05-27 20:41                 ` David S. Miller
2005-05-27 20:40               ` David S. Miller
2005-05-27 22:46                 ` Dave Jones
2005-04-21 23:58     ` [patch 2.6.12-rc2 2/10] tg3: add bcm5752 to tg3_pci_tbl David S. Miller
2005-04-21 23:57   ` [patch 2.6.12-rc2 1/10] tg3: add basic bcm5752 support David S. Miller
2005-04-18  6:42 ` [PATCH 2.6.12-rc2 0/11] tg3: Add complete support for 5752 Michael Chan
2005-04-18  6:50   ` [PATCH 2.6.12-rc2 1/11] tg3: Minor 5752 fixes Michael Chan
2005-04-18  7:08     ` [PATCH 2.6.12-rc2 2/11] tg3: Split tg3_phy_probe into 2 functions Michael Chan
2005-04-18  7:22   ` [PATCH 2.6.12-rc2 3/11] tg3: Setup proper GPIO settings Michael Chan
2005-04-18  7:28   ` [PATCH 2.6.12-rc2 4/11] tg3: Fix tg3_set_power_state() Michael Chan
2005-04-18  7:37   ` [PATCH 2.6.12-rc2 5/11] tg3: Workaround 5752 A0 chip ID Michael Chan
2005-04-18  7:47     ` [PATCH 2.6.12-rc2 7/11] tg3: Add nvram detection for 5752 Michael Chan
2005-04-18  7:54     ` [PATCH 2.6.12-rc2 8/11] tg3: Add nvram lock-out support for 5752 TPM Michael Chan
2005-04-18  7:57     ` [PATCH 2.6.12-rc2 9/11] tg3: Fix bug in tg3_set_eeprom() Michael Chan
2005-04-18  7:59     ` Michael Chan [this message]
2005-04-18  8:02     ` [PATCH 2.6.12-rc2 11/11] tg3: Add msi test Michael Chan
2005-04-18  7:41   ` [PATCH 2.6.12-rc2 6/11] tg3: Add GPIO3 for 5752 Michael Chan
2005-04-22  0:15   ` [PATCH 2.6.12-rc2 0/11] tg3: Add complete support " David S. Miller

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1113811169.6504.80.camel@rh4 \
    --to=mchan@broadcom.com \
    --cc=davem@davemloft.net \
    --cc=linville@tuxdriver.com \
    --cc=netdev@oss.sgi.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.