PPC Linux painic problem!

Alex Zeffertt ajz at cambridgebroadband.com
Mon Apr 26 20:45:22 EST 2004


On Mon, 2004-04-26 at 08:20, Marius Groeger wrote:
> Jeffy,
>
> On Mon, 26 Apr 2004, jeffy wrote:
>
> >
> > Hi all,
> > 	I hit on a problem about PPC Linux version 2.4.4 on a MPC855T board.
> >     The kernel can start up ok normally, but when another PC
> > continous sending UDP packets to it(about 8Mbps) when kernel is
> > starting up, the kernel failed start up and printf the following
> > messages:
>
> This is just a VERY wild guess: check the driver source
> (arch/ppc/8xx_io/fec.c in your case) and make sure the driver only forwards
> received packets to the IP stack when the interface is configured "UP".
> There once was a similar problem with the 826x driver.
>
> Another reason could be that the FEC channel is not properly shut down by
> the firmware/bootloader before entering the kernel.
>
> Next time try to add more information about your system, especially about
> the kernel and bootloader version you are using.
>
> Regards,
> Marius

Hi all,

I think Marius' wild guess is correct!  Until 5 minutes ago I had the
same problem as Jeffy.  My fix is to disable rx interrupts until
fec_enet_open() is called.  See the patch below.  Thanks Marius.

BTW, the patch may not apply because of other changes to fec.c, so
here's a description:
	1st block: add int allow_rx to fec_enet_private struct
	2nd block: set allow_rx in fec_enet_open()
	3rd block: unset allow_rx in fec_enet_stop()
	4th block: in fec_restart() only set IMASK[RXF] if allow_rx set

Alex

===================================================================
RCS file: /newcvs/ppc-linux/kernel/arch/ppc/8xx_io/fec.c,v
retrieving revision 1.41
diff -u -r1.41 fec.c
--- fec.c	22 Apr 2004 13:32:01 -0000	1.41
+++ fec.c	26 Apr 2004 10:34:28 -0000
@@ -220,6 +220,7 @@
 	struct	net_device_stats stats;
 	uint	tx_full;
 	spinlock_t lock;
+    int allow_rx;

 #ifdef	CONFIG_USE_MDIO
 	uint	phy_id;
@@ -1932,6 +1933,7 @@
 {
 	struct fec_enet_private *fep = dev->priv;

+    fep->allow_rx = 1;
 	/* I should reset the ring buffers here, but I don't yet know
 	 * a simple way to do that.
 	 */
@@ -1971,11 +1973,12 @@
 static int
 fec_enet_close(struct net_device *dev)
 {
+	struct fec_enet_private *fep = dev->priv;
 	/* Don't know what to do yet.
 	*/
 	netif_stop_queue(dev);
 	fec_stop(dev);
-
+    fep->allow_rx = 0;
 	return 0;
 }

@@ -2661,7 +2664,7 @@

 	/* Enable interrupts we wish to service.
 	*/
-	fecp->fec_imask = ( FEC_ENET_TXF | FEC_ENET_RXF | FEC_ENET_MII );
+	fecp->fec_imask = ( FEC_ENET_TXF | ((fep->allow_rx)?FEC_ENET_RXF:0) | FEC_ENET_MII );

 	/* And last, enable the transmit and receive processing.
 	*/


** Sent via the linuxppc-embedded mail list. See http://lists.linuxppc.org/





More information about the Linuxppc-embedded mailing list