this was in my queue since 2005/10/26

git-svn-id: svn://svn.coreboot.org/coreboot/trunk@2252 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
This commit is contained in:
Stefan Reinauer 2006-04-11 19:23:57 +00:00
parent fbce0ffb92
commit cf648c9a99
1 changed files with 33 additions and 7 deletions

View File

@ -278,8 +278,21 @@ static void ht_collapse_early_enumeration(struct bus *bus, unsigned offset_uniti
} }
/* Has the link failed? */ /* Has the link failed? */
if (ctrl & (1 << 4)) { if (ctrl & (1 << 4)) {
/*
* 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 << 4) | (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");
return; return;
} }
}
} while((ctrl & (1 << 5)) == 0); } while((ctrl & (1 << 5)) == 0);
//actually, only for one HT device HT chain, and unitid is 0 //actually, only for one HT device HT chain, and unitid is 0
@ -382,13 +395,26 @@ unsigned int hypertransport_scan_chain(struct bus *bus,
/* Wait until the link initialization is complete */ /* Wait until the link initialization is complete */
do { do {
ctrl = pci_read_config16(prev.dev, prev.pos + prev.ctrl_off); ctrl = pci_read_config16(prev.dev, prev.pos + prev.ctrl_off);
/* Is this the end of the hypertransport chain?
* Has the link failed? if (ctrl & (1 << 6))
* If so further scanning is pointless. 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
*/ */
if (ctrl & ((1 << 6) | (1 << 4))) { ctrl |= ((1 << 4) | (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; goto end_of_chain;
} }
}
} while((ctrl & (1 << 5)) == 0); } while((ctrl & (1 << 5)) == 0);