Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 30 May 2009 12:37:38 -0700
From:      Marcel Moolenaar <xcllnt@mac.com>
To:        Rafal Jaworowski <raj@semihalf.com>
Cc:        ppc@FreeBSD.org
Subject:   Re: MPC8555CDS: U-Boot vs loader compatibility
Message-ID:  <0B237AD8-FC97-4264-9A39-E4C266633E7F@mac.com>
In-Reply-To: <DC352583-41E0-4140-BF22-8E81B7B6F1D9@semihalf.com>
References:  <B8C7C826-1DC9-4B66-8ECE-86B6C200F0F6@mac.com> <EB949125-E138-49FE-B5BE-1C72AF467CA9@semihalf.com> <DC352583-41E0-4140-BF22-8E81B7B6F1D9@semihalf.com>

next in thread | previous in thread | raw e-mail | index | archive | help

On May 28, 2009, at 7:48 AM, Rafal Jaworowski wrote:

>
> On 2009-05-26, at 21:15, Rafal Jaworowski wrote:
>
>> On 2009-05-26, at 18:50, Marcel Moolenaar wrote:
>>
>>> I think I recently updated the FreeBSD loader on my CDS
>>> that has U-Boot version 1.3.2-rc1 on it (yes, that sounds
>>> rather fuzzy :-) In any case, the latest PowerPC U-Boot
>>> loader is having a problem with netbooting. I see packets
>>> being transmitted (BOOTP), but none of the responses seem
>>> to arrive at the loader. Then the ARP resolution is
>>> attempted, which fails as well.
>>
>> I'll try the latest loader tomorrow and let you know how this work  
>> here.
>
> I checked a freshly built loader from HEAD and it works fine with U- 
> Boot 2008.10-rc2-00091-g2f4342b.

Ok, the problem is this: when packets arrive on the interface that
are larger than the buffer being passed to U-Boot from the loader,
then the eth_receive returns -1 and leaves the packet saved. The
next call to eth_receive(0 will find that same packet and can fail
for the exact same reason. A typical scenario is the loader doing
ARP with a buffer of 66 bytes. The end result is that the ARP
will fail and the loader panics.

This obviously depends on the amount and kind of traffic on the
LAN in question...

The following U-Boot patch fixes the problem (against 1.3.4):

diff -u u-boot-1.3.4-orig/net/eth.c u-boot-1.3.4-local/net/eth.c
--- u-boot-1.3.4-orig/net/eth.c	2008-08-12 07:08:38.000000000 -0700
+++ u-boot-1.3.4-local/net/eth.c	2009-05-30 12:19:20.000000000 -0700
@@ -526,10 +526,7 @@
  			return -1;
  	}

-	if (length < eth_rcv_bufs[eth_rcv_current].length)
-		return -1;
-
-	length = eth_rcv_bufs[eth_rcv_current].length;
+	length = min(length, eth_rcv_bufs[eth_rcv_current].length);

  	for (i = 0; i < length; i++)
  		p[i] = eth_rcv_bufs[eth_rcv_current].data[i];

FYI,

-- 
Marcel Moolenaar
xcllnt@mac.com






Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?0B237AD8-FC97-4264-9A39-E4C266633E7F>