diff --git a/api/api_storage.c b/api/api_storage.c
index c535712..ab4cad5 100644
--- a/api/api_storage.c
+++ b/api/api_storage.c
@@ -165,8 +165,21 @@ static int dev_stor_get(int type, int first, int *more, struct device_info *di)
 				debugf("device instance exists, but is not active..");
 				found = 0;
 			} else {
-				di->di_stor.block_count = dd->lba;
-				di->di_stor.block_size = dd->blksz;
+#define COPY_ATTR(a) di->di_stor.a = dd->a
+				COPY_ATTR(if_type);
+				COPY_ATTR(dev);
+				COPY_ATTR(part_type);
+				COPY_ATTR(target);
+				COPY_ATTR(lun);
+				COPY_ATTR(type);
+				COPY_ATTR(removable);
+				COPY_ATTR(lba48);
+				COPY_ATTR(lba);
+				COPY_ATTR(blksz);
+#undef COPY_ATTR
+				strcpy(di->di_stor.vendor, dd->vendor);
+				strcpy(di->di_stor.product, dd->product);
+				strcpy(di->di_stor.revision, dd->revision);
 			}
 		}
 
diff --git a/examples/api/demo.c b/examples/api/demo.c
index 65e7491..0c65ae9 100644
--- a/examples/api/demo.c
+++ b/examples/api/demo.c
@@ -294,7 +294,18 @@ void test_dump_di(int handle)
 
 	} else if (di->type & DEV_TYP_STOR) {
 		printf("  type\t\t= %s\n", test_stor_typ(di->type));
-		printf("  blk size\t\t= %d\n", (unsigned int)di->di_stor.block_size);
-		printf("  blk count\t\t= %d\n", (unsigned int)di->di_stor.block_count);
+		printf("  if_type\t\t= %d\n", di->di_stor.if_type);
+		printf("  dev\t\t= %d\n", di->di_stor.dev);
+		printf("  part_type\t\t= %d\n", di->di_stor.part_type);
+		printf("  target\t\t= %d\n", di->di_stor.target);
+		printf("  lun\t\t= %d\n", di->di_stor.lun);
+		printf("  device type\t\t= %d\n", di->di_stor.type);
+		printf("  removable\t\t= %d\n", di->di_stor.removable);
+		printf("  lba48\t\t= %d\n", di->di_stor.lba48);
+		printf("  blk size\t\t= %d\n", (unsigned int)di->di_stor.blksz);
+		printf("  blk count\t\t= %d\n", (unsigned int)di->di_stor.lba);
+		printf("  vendor\t\t= %s\n", di->di_stor.vendor);
+		printf("  product\t\t= %s\n", di->di_stor.product);
+		printf("  revision\t\t= %s\n", di->di_stor.revision);
 	}
 }
diff --git a/include/api_public.h b/include/api_public.h
index 5940d81..245904f 100644
--- a/include/api_public.h
+++ b/include/api_public.h
@@ -111,12 +111,7 @@ struct sys_info {
 	int			mr_no;	/* number of memory regions */
 };
 
-#undef CONFIG_SYS_64BIT_LBA
-#ifdef CONFIG_SYS_64BIT_LBA
-typedef	u_int64_t lbasize_t;
-#else
 typedef unsigned long lbasize_t;
-#endif
 typedef unsigned long lbastart_t;
 
 #define DEV_TYP_NONE	0x0000
@@ -138,8 +133,7 @@ struct device_info {
 
 	union {
 		struct {
-			lbasize_t	block_count;	/* no of blocks */
-			unsigned long	block_size;	/* size of one block */
+			#include "block_dev_attr.h"
 		} storage;
 
 		struct {
diff --git a/include/block_dev_attr.h b/include/block_dev_attr.h
new file mode 100644
index 0000000..07a76d8
--- /dev/null
+++ b/include/block_dev_attr.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2011 The Chromium OS Authors.
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+/*
+ * These are attributes for struct like block_dev_desc.  Include this header
+ * inside a struct definition to populate that struct with these attributes.
+ */
+
+int		if_type;	/* type of the interface */
+int		dev;		/* device number */
+unsigned char	part_type;	/* partition type */
+unsigned char	target;		/* target SCSI ID */
+unsigned char	lun;		/* target LUN */
+unsigned char	type;		/* device type */
+unsigned char	removable;	/* removable device */
+unsigned char	lba48;		/* device can use 48bit addr (ATA/ATAPI v7) */
+uint64_t	lba;		/* number of blocks */
+unsigned long	blksz;		/* block size */
+char		vendor[40+1];	/* IDE model, SCSI Vendor */
+char		product[20+1];	/* IDE Serial no, SCSI product */
+char		revision[8+1];	/* firmware revision */
diff --git a/include/part.h b/include/part.h
index be0a22e..2d2b599 100644
--- a/include/part.h
+++ b/include/part.h
@@ -26,19 +26,9 @@
 #include <ide.h>
 
 typedef struct block_dev_desc {
-	int		if_type;	/* type of the interface */
-	int		dev;		/* device number */
-	unsigned char	part_type;	/* partition type */
-	unsigned char	target;		/* target SCSI ID */
-	unsigned char	lun;		/* target LUN */
-	unsigned char	type;		/* device type */
-	unsigned char	removable;	/* removable device */
-	unsigned char	lba48;		/* device can use 48bit addr (ATA/ATAPI v7) */
-	uint64_t	lba;		/* number of blocks */
-	unsigned long	blksz;		/* block size */
-	char		vendor [40+1];	/* IDE model, SCSI Vendor */
-	char		product[20+1];	/* IDE Serial no, SCSI product */
-	char		revision[8+1];	/* firmware revision */
+
+	#include "block_dev_attr.h"
+
 	unsigned long	(*block_read)(int dev,
 				      unsigned long start,
 				      lbaint_t blkcnt,
