cvs commit: src/sys/dev/bge if_bge.c
Bruce Evans
bde at zeta.org.au
Mon Dec 18 03:41:20 PST 2006
On Sat, 16 Dec 2006, I wrote:
> On Thu, 14 Dec 2006, I wrote:
>
>> On Wed, 13 Dec 2006, Jung-uk Kim wrote:
>>
>>> On Wednesday 13 December 2006 03:51 pm, Scott Long wrote:
>>>> scottl 2006-12-13 20:51:51 UTC
>>>>
>>>> FreeBSD src repository
>>>>
>>>> Modified files:
>>>> sys/dev/bge if_bge.c
>>>> Log:
>>>> Remove a redundant write of the firmware reset magic number. It
>>>> ...
>>> I am still getting firmware handshake timeouts and/or watchdog
>>> timeouts. Most importantly it panics or get witness warnings (lots
>>> of 'memory modified after free'). Panic goes like this (while
>>> kldunload if_bge with dhclient enabled):
>>>
>>> brgphy0: detached
>>> miibus0: detached
>>> bge0: firmware handshake timed out, found 0x4b657654
>>> bge0: firmware handshake timed out, found 0x4b657654
>>
>> I have seen these for debugging the redundant-write problem (not for
>> detach but for bringing up the interface for the first time). My 5701
>> just hangs if there is any redundant write (2 where the first one was
>> in bge_reset(), or 2 separate, or 2 where the second one was). My
>> 5705 survives two separate sets of 256 repeated writes; however, then
>> the firmware handshake times out; however2, everything works normally
>> after ignoring the the timeout except for printing the message. I
>> just noticed that this error wasn't ignored until recently -- I noticed
>> the return statement being removed but not that it was in a critical
>> area.
>
> The debugging code doesn't seem to have been responsible for this.
> Now, without it I almost (?) always get handshake errors on the 5705,
> but never (?) on the 5701. Apparently, the 3rd write (the one that
> was removed) was the only correctly placed one.
Avoiding the "write_op" part of the changes fixes the handshake errors
on my non-PCIE 5705. write_op is only used to write the reset value and
one other value to BGE_MISC_CFG. bge_writemem_ind() apparently writes
the reset to nowhere, but bge_writereg() still works.
%%%
Index: if_bge.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/bge/if_bge.c,v
retrieving revision 1.165
diff -u -2 -r1.165 if_bge.c
--- if_bge.c 15 Dec 2006 00:27:06 -0000 1.165
+++ if_bge.c 18 Dec 2006 10:44:05 -0000
@@ -2544,4 +2634,7 @@
if (sc->bge_flags & BGE_FLAG_PCIE)
write_op = bge_writemem_direct;
+ /* XXX bge_writemem_ind is wrong for at least reset of 5705. */
+ else if (sc->bge_asicrev == BGE_ASICREV_BCM5705)
+ write_op = bge_writereg_ind;
else
write_op = bge_writemem_ind;
%%%
The panics might be caused by the change making the reset null. Resetting
might be much more necessary for uninitialization than for initialization.
The bug caused the following behaviour here:
- the problem with taking a long time to start serving nfs requests (with
/usr nfs-mounted) became larger. Normally, nfs tries to start before
the interface is really up and then it takes about a minute to start.
With the bug, it often got portmap errors and sometimes never started.
- after "ifconfig down", it took a reboot to bring the interface back up.
Bruce
More information about the cvs-src
mailing list