Adds a retry/faildown to SB600 SATA detection logic.

SATA port status kept returning 0x1: BAR5+po+28h
1h = Device presence detected but Phy communication not established
 
This patch adds logic to force 1.5g if the drive fails to communicate at 3.0g.

Thanks
Dan Lykowski

Signed-off-by: Dan Lykowski <[email protected]>



      
Index: src/southbridge/amd/sb600/sb600_sata.c
===================================================================
--- src/southbridge/amd/sb600/sb600_sata.c	(revision 3860)
+++ src/southbridge/amd/sb600/sb600_sata.c	(working copy)
@@ -175,6 +176,35 @@
 		byte = readb(sata_bar5 + 0x128 + 0x80 * i);
 		printk_spew("SATA port %i status = %x\n", i, byte);
 		byte &= 0xF;
+
+		if( byte == 0x1 ) {
+			/* If the drive status is 0x1 then we see it but we aren't talking to it. */
+			/* Try to do something about it. */
+			printk_spew("SATA device detected but not talking. Trying lower speed.\n");
+
+			/* Read in Port-N Serial ATA Control Register */
+			byte = readb(sata_bar5 + 0x12C + 0x80 * i);
+
+			/* Set Reset Bit and 1.5g bit */
+			byte |= 0x11; 
+			writeb(byte, (sata_bar5 + 0x12C + 0x80 * i));
+			
+			/* Wait 1ms */			
+			mdelay(1); 
+
+			/* Clear Reset Bit */
+			byte &= ~0x01; 
+			writeb(byte, (sata_bar5 + 0x12C + 0x80 * i));
+
+			/* Wait 1ms */
+			mdelay(1);
+
+			/* Reread status */
+			byte = readb(sata_bar5 + 0x128 + 0x80 * i);
+			printk_spew("SATA port %i status = %x\n", i, byte);
+			byte &= 0xF;
+		}
+
 		if (byte == 0x3) {
 			for (j = 0; j < 10; j++) {
 				if (!sata_drive_detect(i, ((i / 2) == 0) ? sata_bar0 : sata_bar2))
--
coreboot mailing list: [email protected]
http://www.coreboot.org/mailman/listinfo/coreboot

Reply via email to