[LinuxBIOS] Proposed change to hypertransport.c for better error handling

Stefan Reinauer stepan at openbios.org
Fri Oct 21 21:28:54 CEST 2005


Hi San,

this is good stuff, it should go in the tree. If nobody objects, I'll
put it in by the end of this weekend. Same for the other patch (gotta
check if the last lnxi mega patch doesn't do that one already though)

Stefan

* San Mehat <san at google.com> [051021 17:19]:
> *****BEGIN CUT*****
> Index: hypertransport.c
> ===================================================================
> --- hypertransport.c    (revision 2064)
> +++ hypertransport.c    (working copy)
> @@ -345,12 +345,25 @@
>                 /* Wait until the link initialization is complete */
>                 do {
>                         ctrl = pci_read_config16(prev.dev, prev.pos +
> prev.ctrl_off);
> -                       /* Is this the end of the hypertransport chain?
> -                        * Has the link failed?
> -                        * If so further scanning is pointless.
> -                        */
> -                       if (ctrl & ((1 << 6) | (1 << 4))) {
> -                               goto end_of_chain;
> +
> +                       if (ctrl & (1 << 6))
> +                               goto end_of_chain;      // End of chain
> +
> +                       if (ctrl & ((1 << 4) | (1 << 8))) {
> +                               /*
> +                                * Either the link has failed, or we have
> +                                * a CRC error.
> +                                * Sometimes this can happen due to link
> +                                * retrain, so lets knock it down and see
> +                                * if its transient
> +                                */
> +                               ctrl |= ((1 << 6) | (1 <<8)); // Link fail +
> Crc
> +                               pci_write_config16(prev.dev, prev.pos +
> prev.ctrl_off, ctrl);
> +                               ctrl = pci_read_config16(prev.dev, prev.pos +
> prev.ctrl_off);
> +                               if (ctrl & ((1 << 4) | (1 << 8))) {
> +                                       printk_alert("Detected error on
> Hypertransport Link\n");
> +                                       goto end_of_chain;
> +                               }
>                         }
>                 } while((ctrl & (1 << 5)) == 0);
> 
> ****END CUT*****
> 

> -- 
> LinuxBIOS mailing list
> LinuxBIOS at openbios.org
> http://www.openbios.org/mailman/listinfo/linuxbios




More information about the coreboot mailing list