All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrew Morton <akpm@linux-foundation.org>
To: "J.A. Magallón " <jamagallon@ono.com>
Cc: linux-kernel@vger.kernel.org, Auke Kok <auke-jan.h.kok@intel.com>
Subject: Re: e1000 oops on boot [Re: 2.6.21-rc2-mm2]
Date: Wed, 7 Mar 2007 16:23:15 -0800	[thread overview]
Message-ID: <20070307162315.76f2a60b.akpm@linux-foundation.org> (raw)
In-Reply-To: <20070308010323.58b80d96@werewolf-wl>

On Thu, 8 Mar 2007 01:03:23 +0100
"J.A. Magall__n" <jamagallon@ono.com> wrote:

> On Tue, 6 Mar 2007 00:44:08 -0800, Andrew Morton <akpm@linux-foundation.org> wrote:
> 
> > 
> > Temporarily at
> > 
> >   http://userweb.kernel.org/~akpm/2.6.21-rc2-mm2/
> > 
> 
> e1000 gave this on a warm boot:
> 
> http://belly.cps.unizar.es/~magallon/oops/IMG_1510.JPG
> 
> Any idea ?


e1000_intr() did a jump-to-zero.

This might be because e1000 is calling request_irq() before everything is
set up.  We used to have that fixed, but it got reverted because it broke
other things (msi, iirc).

The below will apppear in -rc3-mm1 (hopefully later today) and it will
hopefully fix that crash.



From: Auke Kok <auke-jan.h.kok@intel.com>

DEBUG_SHIRQ code exposed that e1000 was not ready for incoming interrupts
after having called pci_request_irq.  This obviously requires us to finish our
software setup which assigns the irq handler before we request the irq.

Signed-off-by: Auke Kok <auke-jan.h.kok@intel.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
---

 drivers/net/e1000/e1000_main.c |   66 +++++++++++++++++++++----------
 1 files changed, 45 insertions(+), 21 deletions(-)

diff -puN drivers/net/e1000/e1000_main.c~e1000-fix-be-ready-for-incoming-irq-at-pci_request_irq drivers/net/e1000/e1000_main.c
--- a/drivers/net/e1000/e1000_main.c~e1000-fix-be-ready-for-incoming-irq-at-pci_request_irq
+++ a/drivers/net/e1000/e1000_main.c
@@ -522,14 +522,15 @@ e1000_release_manageability(struct e1000
 	}
 }
 
-int
-e1000_up(struct e1000_adapter *adapter)
+/**
+ * e1000_configure - configure the hardware for RX and TX
+ * @adapter = private board structure
+ **/
+static void e1000_configure(struct e1000_adapter *adapter)
 {
 	struct net_device *netdev = adapter->netdev;
 	int i;
 
-	/* hardware has been reset, we need to reload some things */
-
 	e1000_set_multi(netdev);
 
 	e1000_restore_vlan(adapter);
@@ -548,14 +549,20 @@ e1000_up(struct e1000_adapter *adapter)
 	}
 
 	adapter->tx_queue_len = netdev->tx_queue_len;
+}
+
+int e1000_up(struct e1000_adapter *adapter)
+{
+	/* hardware has been reset, we need to reload some things */
+	e1000_configure(adapter);
+
+	clear_bit(__E1000_DOWN, &adapter->flags);
 
 #ifdef CONFIG_E1000_NAPI
-	netif_poll_enable(netdev);
+	netif_poll_enable(adapter->netdev);
 #endif
 	e1000_irq_enable(adapter);
 
-	clear_bit(__E1000_DOWN, &adapter->flags);
-
 	/* fire a link change interrupt to start the watchdog */
 	E1000_WRITE_REG(&adapter->hw, ICS, E1000_ICS_LSC);
 	return 0;
@@ -640,15 +647,15 @@ e1000_down(struct e1000_adapter *adapter
 	 * reschedule our watchdog timer */
 	set_bit(__E1000_DOWN, &adapter->flags);
 
+#ifdef CONFIG_E1000_NAPI
+	netif_poll_disable(netdev);
+#endif
 	e1000_irq_disable(adapter);
 
 	del_timer_sync(&adapter->tx_fifo_stall_timer);
 	del_timer_sync(&adapter->watchdog_timer);
 	del_timer_sync(&adapter->phy_info_timer);
 
-#ifdef CONFIG_E1000_NAPI
-	netif_poll_disable(netdev);
-#endif
 	netdev->tx_queue_len = adapter->tx_queue_len;
 	adapter->link_speed = 0;
 	adapter->link_duplex = 0;
@@ -1410,21 +1417,17 @@ e1000_open(struct net_device *netdev)
 		return -EBUSY;
 
 	/* allocate transmit descriptors */
-	if ((err = e1000_setup_all_tx_resources(adapter)))
+	err = e1000_setup_all_tx_resources(adapter);
+	if (err)
 		goto err_setup_tx;
 
 	/* allocate receive descriptors */
-	if ((err = e1000_setup_all_rx_resources(adapter)))
-		goto err_setup_rx;
-
-	err = e1000_request_irq(adapter);
+	err = e1000_setup_all_rx_resources(adapter);
 	if (err)
-		goto err_req_irq;
+		goto err_setup_rx;
 
 	e1000_power_up_phy(adapter);
 
-	if ((err = e1000_up(adapter)))
-		goto err_up;
 	adapter->mng_vlan_id = E1000_MNG_VLAN_NONE;
 	if ((adapter->hw.mng_cookie.status &
 			  E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT)) {
@@ -1437,12 +1440,33 @@ e1000_open(struct net_device *netdev)
 	    e1000_check_mng_mode(&adapter->hw))
 		e1000_get_hw_control(adapter);
 
+	/* before we allocate an interrupt, we must be ready to handle it.
+	 * Setting DEBUG_SHIRQ in the kernel makes it fire an interrupt
+	 * as soon as we call pci_request_irq, so we have to setup our
+	 * clean_rx handler before we do so.  */
+	e1000_configure(adapter);
+
+	err = e1000_request_irq(adapter);
+	if (err)
+		goto err_req_irq;
+
+	/* From here on the code is the same as e1000_up() */
+	clear_bit(__E1000_DOWN, &adapter->flags);
+
+#ifdef CONFIG_E1000_NAPI
+	netif_poll_enable(netdev);
+#endif
+
+	e1000_irq_enable(adapter);
+
+	/* fire a link status change interrupt to start the watchdog */
+	E1000_WRITE_REG(&adapter->hw, ICS, E1000_ICS_LSC);
+
 	return E1000_SUCCESS;
 
-err_up:
-	e1000_power_down_phy(adapter);
-	e1000_free_irq(adapter);
 err_req_irq:
+	e1000_release_hw_control(adapter);
+	e1000_power_down_phy(adapter);
 	e1000_free_all_rx_resources(adapter);
 err_setup_rx:
 	e1000_free_all_tx_resources(adapter);
_


  reply	other threads:[~2007-03-08  0:23 UTC|newest]

Thread overview: 51+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-03-06  8:44 2.6.21-rc2-mm2 Andrew Morton
2007-03-06  9:06 ` 2.6.21-rc2-mm2 J.A. Magallón
2007-03-06  9:15   ` 2.6.21-rc2-mm2 Andrew Morton
2007-03-06  9:38     ` 2.6.21-rc2-mm2 J.A. Magallón
2007-03-06  9:42       ` 2.6.21-rc2-mm2 Andrew Morton
2007-03-06  9:44         ` 2.6.21-rc2-mm2 J.A. Magallón
2007-03-06 11:14   ` 2.6.21-rc2-mm2 Jens Axboe
2007-03-06 10:27 ` 2.6.21-rc2-mm2 KAMEZAWA Hiroyuki
2007-03-06 11:09   ` 2.6.21-rc2-mm2 Andrew Morton
2007-03-06 11:35     ` 2.6.21-rc2-mm2 KAMEZAWA Hiroyuki
2007-03-07  6:23       ` [BUGFIX][PATCH] fix NULL pointer in ia64/irq_chip-mask/unmask function KAMEZAWA Hiroyuki
2007-03-07  6:57         ` Andrew Morton
2007-03-07  7:32           ` KAMEZAWA Hiroyuki
2007-03-08  8:41   ` 2.6.21-rc2-mm2 Magnus Damm
2007-03-06 11:58 ` 2.6.21-rc2-mm2 Con Kolivas
2007-03-06 12:52   ` 2.6.21-rc2-mm2 Thomas Gleixner
2007-03-06 13:24     ` 2.6.21-rc2-mm2 Con Kolivas
2007-03-06 14:47       ` 2.6.21-rc2-mm2 Thomas Gleixner
2007-03-06 20:19         ` 2.6.21-rc2-mm2 Con Kolivas
2007-03-06 15:46 ` 2.6.21-rc2-mm2 J.A. Magallón
2007-03-07  6:24   ` 2.6.21-rc2-mm2 Jean Delvare
2007-03-07  8:39 ` 2.6.21-rc2-mm2 Sébastien Dugué
2007-03-07  8:49   ` 2.6.21-rc2-mm2 Andrew Morton
2007-03-07  9:30     ` 2.6.21-rc2-mm2 Sébastien Dugué
2007-03-07 19:46 ` 2.6.21-rc2-mm2 Luiz Fernando N. Capitulino
2007-03-07 19:52   ` 2.6.21-rc2-mm2 Andrew Morton
2007-03-08  7:20     ` 2.6.21-rc2-mm2 Mike Galbraith
2007-03-07 22:12 ` 2.6.21-rc2-mm2 hang Dave Hansen
2007-03-07 22:46   ` Andrew Morton
     [not found]   ` <20070307221628.GD26473@linux-os.sc.intel.com>
2007-03-07 23:07     ` Dave Hansen
2007-03-07 23:16       ` Andrew Morton
2007-03-08 15:07         ` Michal Piotrowski
2007-03-08  1:07   ` Siddha, Suresh B
2007-03-07 22:41 ` [RFC: -mm patch] #if 0 mmc_deselect_cards() Adrian Bunk
2007-03-08  5:47   ` Pierre Ossman
2007-03-19  9:21     ` [-mm patch] remove mmc_deselect_cards() Adrian Bunk
2007-03-08  6:31   ` MMC: Fix typo in mmc highspeed Kyungmin Park
2007-03-07 22:41 ` 2.6.21-rc2-mm2: drivers/net/wireless/libertas/debugfs.c addr bogosity Adrian Bunk
2007-03-07 23:00   ` Andrew Morton
2007-03-08  8:02     ` Adrian Bunk
2007-03-09  2:11     ` Tony Breeds
2007-03-09 14:19       ` John W. Linville
2007-03-09 14:19         ` John W. Linville
2007-03-09 17:14         ` Randy Dunlap
2007-03-09 17:14           ` Randy Dunlap
2007-03-09 17:14           ` Randy Dunlap
2007-03-12  3:43           ` Tony Breeds
2007-03-08  0:03 ` e1000 oops on boot [Re: 2.6.21-rc2-mm2] J.A. Magallón
2007-03-08  0:23   ` Andrew Morton [this message]
2007-03-08  0:28     ` Randy Dunlap
2007-03-08  0:35       ` Kok, Auke

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=20070307162315.76f2a60b.akpm@linux-foundation.org \
    --to=akpm@linux-foundation.org \
    --cc=auke-jan.h.kok@intel.com \
    --cc=jamagallon@ono.com \
    --cc=linux-kernel@vger.kernel.org \
    /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.