On Fri, Mar 09, 2012 at 01:01:26AM +0100, Andreas Longwitz wrote:
> Hi,
> 
> recently I installed FreeBSD 8.2 Stable on some older machines with
> Intel 82550 and 82550C and found that the loading of microcode with the
> parameter link0 in the ifconfig command did not work anymore. The reason
> for this is the commit r223608 for if_fxp.c with the comment:
> 
> Disable microcode loading for 82550 and 82550C controllers. Loading
> the microcode caused SCB timeouts.
> 
> I do not agree with this motivation and try to explain why.
> 
> Without loading the microcode on 82550(C) there is a problem with
>    mount_nfs -U server:/bigdisk /mnt
>    cp /mnt/bigfile bigfile
> 
> NFS with UDP works with 8 KB blocks and the cp hangs after some seconds
> and you see SCB messages on the console. The reason is the TCO bug of
> the hardware mentioned in rcvbundl.h. This old hardware bug disappears
> after loading the microcode.
> 
> All my hardware run without problems in FreeBSD 4.11, loading of
> microcode is done by the function fxp_load_ucode(). Later there was
> trouble with the loading of microcode, see kern/103332 and kern/118909.
> I have posted my solution for the problem to kern/103332 but
> unfortunately this PR is not online anymore and so I repeat my
> considerations here.
> 
> The difference of the function fxp_load_ucode() of FreeBSD 4.11 and
> later versions is that this function in 4.11 has an own private memory
> buffer for construction of the microcode message. In later versions
> fxp_load_ucode() must use a memory buffer that is shared with other
> parts of the driver and these other parts of the driver have problems if
> the shared memory buffer was used by fxp_load_ucode() before. Thats the
> reason for "Loading microcode caused SCB timeouts".
> 
> Therefore my proposal is to revert r223608 and to clean the used shared
> buffer at the end of the function fxp_load_ucode(). The following patch
> works for me for years now:
> 
> --- if_fxp.c.orig       2012-01-26 12:43:09.000000000 +0100
> +++ if_fxp.c    2012-03-08 23:41:32.000000000 +0100
> @@ -3085,6 +3081,7 @@
>             sc->tunable_int_delay,
>             uc->bundle_max_offset == 0 ? 0 : sc->tunable_bundle_max);
>         sc->flags |= FXP_FLAG_UCODE;
> +       bzero(cbp, (uc->length + 2) * sizeof(uint32_t));
>  }

Unfortunately this still does not make any difference on i82550C
controller(still spews SCB timeouts).  By chance, do you have
original i82550?  Show me the output of 'pciconf -l'.
_______________________________________________
freebsd-net@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-net
To unsubscribe, send any mail to "freebsd-net-unsubscr...@freebsd.org"

Reply via email to