public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
* [U-Boot] [PATCH] cmd_ide: Fix detection problem with missing devices
@ 2009-05-14  5:24 Stefan Roese
  2009-05-14 13:44 ` Wolfgang Denk
  0 siblings, 1 reply; 13+ messages in thread
From: Stefan Roese @ 2009-05-14  5:24 UTC (permalink / raw)
  To: u-boot

Currently only IDE busses are probed and all possible available devices
are listed in the IDE bootup log. Even when devices on the bus are not
available. This leads to the following output on the CPCI750:

IDE:   Bus 0: OK Bus 1: OK
  Device 0: Model: HITACHI_DK23FA-20J Firm: 00M7A0A0 Ser#: 42D182
            Type: Hard Disk
            Capacity: 19077.1 MB = 18.6 GB (39070080 x 512)
  Device 1: Model:  Firm:  Ser#:
            Type: # 1F #
            Capacity: not available
  Device 2: Model: SanDisk SDCFB-128 Firm: vde 1.10 Ser#: gmo5i311404
            Type: Removable Hard Disk
            Capacity: 122.5 MB = 0.1 GB (250880 x 512)
  Device 3: Model:  Firm:  Ser#:
            Type: # 1F #
            Capacity: not available

Here devices 1 + 3 are listed which are not availble.

This patch now fixes this problem by skipping the device output for
non-available devices. This is the resulting log:

IDE:   Bus 0: OK Bus 1: OK
  Device 0: Model: HITACHI_DK23FA-20J Firm: 00M7A0A0 Ser#: 42D182
            Type: Hard Disk
            Capacity: 19077.1 MB = 18.6 GB (39070080 x 512)
  Device 1: not available
  Device 2: Model: SanDisk SDCFB-128 Firm: vde 1.10 Ser#: gmo5i311404
            Type: Removable Hard Disk
            Capacity: 122.5 MB = 0.1 GB (250880 x 512)
  Device 3: not available

Signed-off-by: Stefan Roese <sr@denx.de>
---
 common/cmd_ide.c |   21 ++++++++++++++-------
 1 files changed, 14 insertions(+), 7 deletions(-)

diff --git a/common/cmd_ide.c b/common/cmd_ide.c
index 71db933..7f9217d 100644
--- a/common/cmd_ide.c
+++ b/common/cmd_ide.c
@@ -154,7 +154,7 @@ static void ide_reset(void);
 #define ide_reset()		/* dummy */
 #endif
 
-static void ide_ident(block_dev_desc_t *dev_desc);
+static int ide_ident(block_dev_desc_t *dev_desc);
 static uchar ide_wait(int dev, ulong t);
 
 #define IDE_TIME_OUT	2000	/* 2 sec timeout */
@@ -714,6 +714,7 @@ skip_bus:
 
 	curr_device = -1;
 	for (i = 0; i < CONFIG_SYS_IDE_MAXDEVICE; ++i) {
+		int ret;
 #ifdef CONFIG_IDE_LED
 		int led = (IDE_BUS(i) == 0) ? LED_IDE1 : LED_IDE2;
 #endif
@@ -727,8 +728,12 @@ skip_bus:
 		if (!ide_bus_ok[IDE_BUS(i)])
 			continue;
 		ide_led(led, 1);	/* LED on       */
-		ide_ident(&ide_dev_desc[i]);
+		ret = ide_ident(&ide_dev_desc[i]);
 		ide_led(led, 0);	/* LED off      */
+		if (ret < 0) {
+			puts("not available\n");
+			continue;
+		}
 		dev_print(&ide_dev_desc[i]);
 		if ((ide_dev_desc[i].lba > 0) && (ide_dev_desc[i].blksz > 0)) {
 			init_part(&ide_dev_desc[i]);	/* initialize partition type */
@@ -987,7 +992,7 @@ static void input_data(int dev, ulong *sect_buf, int words)
 
 /* -------------------------------------------------------------------------
  */
-static void ide_ident(block_dev_desc_t *dev_desc)
+static int ide_ident(block_dev_desc_t *dev_desc)
 {
 	ulong iobuf[ATA_SECTORWORDS];
 	unsigned char c;
@@ -1018,7 +1023,7 @@ static void ide_ident(block_dev_desc_t *dev_desc)
 		max_bus_scan = CONFIG_SYS_IDE_MAXBUS;
 	if (device >= max_bus_scan * 2) {
 		dev_desc->type = DEV_TYPE_UNKNOWN;
-		return;
+		return -1;
 	}
 #endif
 
@@ -1087,7 +1092,7 @@ static void ide_ident(block_dev_desc_t *dev_desc)
 				 ATA_LBA | ATA_DEVICE(device));
 			retries++;
 #else
-			return;
+			return -1;
 #endif
 		}
 #ifdef CONFIG_ATAPI
@@ -1096,7 +1101,7 @@ static void ide_ident(block_dev_desc_t *dev_desc)
 	}			/* see above - ugly to read */
 
 	if (retries == 2)	/* Not found */
-		return;
+		return -1;
 #endif
 
 	input_swap_data(device, iobuf, ATA_SECTORWORDS);
@@ -1161,7 +1166,7 @@ static void ide_ident(block_dev_desc_t *dev_desc)
 #ifdef CONFIG_ATAPI
 	if (dev_desc->if_type == IF_TYPE_ATAPI) {
 		atapi_inquiry(dev_desc);
-		return;
+		return 0;
 	}
 #endif /* CONFIG_ATAPI */
 
@@ -1193,6 +1198,8 @@ static void ide_ident(block_dev_desc_t *dev_desc)
 	dev_desc->type = DEV_TYPE_HARDDISK;
 	dev_desc->blksz = ATA_BLOCKSIZE;
 	dev_desc->lun = 0;	/* just to fill something in... */
+
+	return 0;
 }
 
 /* ------------------------------------------------------------------------- */
-- 
1.6.2.5

^ permalink raw reply related	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2009-05-15 20:30 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-05-14  5:24 [U-Boot] [PATCH] cmd_ide: Fix detection problem with missing devices Stefan Roese
2009-05-14 13:44 ` Wolfgang Denk
2009-05-14 13:55   ` Stefan Roese
2009-05-14 14:59     ` Wolfgang Denk
2009-05-14 15:14       ` Stefan Roese
2009-05-14 20:54         ` Wolfgang Denk
2009-05-14 20:57           ` [U-Boot] [PATCH] IDE: bail out of dev_print() for unknow device types Wolfgang Denk
2009-05-14 20:59             ` [U-Boot] [PATCH v2] IDE: bail out of dev_print() for unknown " Wolfgang Denk
2009-05-15  5:27               ` Stefan Roese
2009-05-15  7:27                 ` Wolfgang Denk
2009-05-15  7:33                   ` Stefan Roese
2009-05-15  7:27                 ` [U-Boot] [PATCH v3] " Wolfgang Denk
2009-05-15 20:30                   ` Wolfgang Denk

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox