* Fix CONFIG_NET_MULTI support in include/net.h

* Patches by Kyle Harris, 13 Mar 2003:
  - Add FAT partition support
  - Add command support for FAT
  - Add command support for MMC
  ----
  - Add Intel PXA support for video
  - Add Intel PXA support for MMC
  ----
  - Enable MMC and FAT for lubbock board
  - Other misc changes for lubbock board
diff --git a/common/Makefile b/common/Makefile
index 524e8e2..d93dbb3 100644
--- a/common/Makefile
+++ b/common/Makefile
@@ -31,10 +31,11 @@
 	  cmd_autoscript.o cmd_bedbug.o cmd_bmp.o cmd_boot.o \
 	  cmd_bootm.o cmd_cache.o cmd_console.o cmd_date.o \
 	  cmd_dcr.o cmd_diag.o cmd_doc.o cmd_nand.o cmd_dtt.o \
-	  cmd_eeprom.o cmd_elf.o cmd_fdc.o cmd_fdos.o cmd_flash.o \
+	  cmd_eeprom.o cmd_elf.o \
+	  cmd_fat.o cmd_fdc.o cmd_fdos.o cmd_flash.o \
 	  cmd_fpga.o cmd_i2c.o cmd_ide.o cmd_immap.o \
 	  cmd_jffs2.o cmd_log.o cmd_mem.o cmd_mii.o cmd_misc.o \
-	  cmd_net.o cmd_nvedit.o env_common.o \
+	  cmd_mmc.o cmd_net.o cmd_nvedit.o env_common.o \
 	  env_flash.o env_eeprom.o env_nvram.o env_nowhere.o \
 	  cmd_pci.o cmd_pcmcia.o cmd_portio.o \
 	  cmd_reginfo.o cmd_scsi.o cmd_vfd.o cmd_usb.o \
diff --git a/common/cmd_fat.c b/common/cmd_fat.c
new file mode 100644
index 0000000..4db70e1
--- /dev/null
+++ b/common/cmd_fat.c
@@ -0,0 +1,231 @@
+/*
+ * (C) Copyright 2002
+ * Richard Jones, rjones@nexus-tech.net
+ *
+ * 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
+ */
+
+/*
+ * Boot support
+ */
+#include <common.h>
+#include <command.h>
+#include <cmd_boot.h>
+#include <cmd_autoscript.h>
+#include <s_record.h>
+#include <net.h>
+#include <ata.h>
+
+#if (CONFIG_COMMANDS & CFG_CMD_FAT)
+
+#undef	DEBUG
+
+#include <fat.h>
+
+extern block_dev_desc_t *ide_get_dev (int dev);
+
+int do_fat_fsload (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+{
+	long size;
+	unsigned long offset;
+	unsigned long count;
+
+	if (argc < 3) {
+		printf ("usage:fatload <filename> <addr> [bytes]\n");
+		return (0);
+	}
+
+	offset = simple_strtoul (argv[2], NULL, 16);
+	if (argc == 4)
+		count = simple_strtoul (argv[3], NULL, 16);
+	else
+		count = 0;
+
+	size = file_fat_read (argv[1], (unsigned char *) offset, count);
+
+	printf ("%ld bytes read\n", size);
+
+	return size;
+}
+
+int do_fat_ls (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+{
+	char *filename = "/";
+	int ret;
+
+	if (argc == 2)
+		ret = file_fat_ls (argv[1]);
+	else
+		ret = file_fat_ls (filename);
+
+	return (ret);
+}
+
+int do_fat_fsinfo (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+{
+	int ret;
+
+	ret = 0;
+
+	printf ("FAT info: %d\n", file_fat_detectfs ());
+
+	return (ret);
+}
+
+#ifdef NOT_IMPLEMENTED_YET
+/* find first device whose first partition is a DOS filesystem */
+int find_fat_partition (void)
+{
+	int i, j;
+	block_dev_desc_t *dev_desc;
+	unsigned char *part_table;
+	unsigned char buffer[ATA_BLOCKSIZE];
+
+	for (i = 0; i < CFG_IDE_MAXDEVICE; i++) {
+		dev_desc = ide_get_dev (i);
+		if (!dev_desc) {
+			debug ("couldn't get ide device!\n");
+			return (-1);
+		}
+		if (dev_desc->part_type == PART_TYPE_DOS) {
+			if (dev_desc->
+				block_read (dev_desc->dev, 0, 1, (ulong *) buffer) != 1) {
+				debug ("can't perform block_read!\n");
+				return (-1);
+			}
+			part_table = &buffer[0x1be];	/* start with partition #4 */
+			for (j = 0; j < 4; j++) {
+				if ((part_table[4] == 1 ||	/* 12-bit FAT */
+				     part_table[4] == 4 ||	/* 16-bit FAT */
+				     part_table[4] == 6) &&	/* > 32Meg part */
+				    part_table[0] == 0x80) {	/* bootable? */
+					curr_dev = i;
+					part_offset = part_table[11];
+					part_offset <<= 8;
+					part_offset |= part_table[10];
+					part_offset <<= 8;
+					part_offset |= part_table[9];
+					part_offset <<= 8;
+					part_offset |= part_table[8];
+					debug ("found partition start at %ld\n", part_offset);
+					return (0);
+				}
+				part_table += 16;
+			}
+		}
+	}
+
+	debug ("no valid devices found!\n");
+	return (-1);
+}
+
+int
+do_fat_dump (cmd_tbl_t *cmdtp, bd_t *bd, int flag, int argc, char *argv[])
+{
+	__u8 block[1024];
+	int ret;
+	int bknum;
+
+	ret = 0;
+
+	if (argc != 2) {
+		printf ("needs an argument!\n");
+		return (0);
+	}
+
+	bknum = simple_strtoul (argv[1], NULL, 10);
+
+	if (disk_read (0, bknum, block) != 0) {
+		printf ("Error: reading block\n");
+		return -1;
+	}
+	printf ("FAT dump: %d\n", bknum);
+	hexdump (512, block);
+
+	return (ret);
+}
+
+int disk_read (__u32 startblock, __u32 getsize, __u8 *bufptr)
+{
+	ulong tot;
+	block_dev_desc_t *dev_desc;
+
+	if (curr_dev < 0) {
+		if (find_fat_partition () != 0)
+			return (-1);
+	}
+
+	dev_desc = ide_get_dev (curr_dev);
+	if (!dev_desc) {
+		debug ("couldn't get ide device\n");
+		return (-1);
+	}
+
+	tot = dev_desc->block_read (0, startblock + part_offset,
+				    getsize, (ulong *) bufptr);
+
+	/* should we do this here?
+	   flush_cache ((ulong)buf, cnt*ide_dev_desc[device].blksz);
+	 */
+
+	if (tot == getsize)
+		return (0);
+
+	debug ("unable to read from device!\n");
+
+	return (-1);
+}
+
+
+static int isprint (unsigned char ch)
+{
+	if (ch >= 32 && ch < 127)
+		return (1);
+
+	return (0);
+}
+
+
+void hexdump (int cnt, unsigned char *data)
+{
+	int i;
+	int run;
+	int offset;
+
+	offset = 0;
+	while (cnt) {
+		printf ("%04X : ", offset);
+		if (cnt >= 16)
+			run = 16;
+		else
+			run = cnt;
+		cnt -= run;
+		for (i = 0; i < run; i++)
+			printf ("%02X ", (unsigned int) data[i]);
+		printf (": ");
+		for (i = 0; i < run; i++)
+			printf ("%c", isprint (data[i]) ? data[i] : '.');
+		printf ("\n");
+		data = &data[16];
+		offset += run;
+	}
+}
+#endif	/* NOT_IMPLEMENTED_YET */
+
+#endif	/* CFG_CMD_FAT */
diff --git a/common/cmd_mem.c b/common/cmd_mem.c
index d77b047..bbfe958 100644
--- a/common/cmd_mem.c
+++ b/common/cmd_mem.c
@@ -30,6 +30,9 @@
 #include <common.h>
 #include <command.h>
 #include <cmd_mem.h>
+#if (CONFIG_COMMANDS & CFG_CMD_MMC)
+#include <mmc.h>
+#endif
 
 #if (CONFIG_COMMANDS & (CFG_CMD_MEMORY | CFG_CMD_PCI | CFG_CMD_I2C\
 			| CMD_CMD_PORTIO))
@@ -323,6 +326,46 @@
 	}
 #endif
 
+#if (CONFIG_COMMANDS & CFG_CMD_MMC)
+	if (mmc2info(dest)) {
+		int rc;
+
+		printf ("Copy to MMC... ");
+		switch (rc = mmc_write ((uchar *)addr, dest, count*size)) {
+		case 0:
+			printf ("\n");
+			return 1;
+		case -1:
+			printf("failed\n");
+			return 1;
+		default:
+			printf ("%s[%d] FIXME: rc=%d\n",__FILE__,__LINE__,rc);
+			return 1;
+		}
+		puts ("done\n");
+		return 0;
+	}
+
+	if (mmc2info(addr)) {
+		int rc;
+
+		printf ("Copy from MMC... ");
+		switch (rc = mmc_read (addr, (uchar *)dest, count*size)) {
+		case 0:
+			printf ("\n");
+			return 1;
+		case -1:
+			printf("failed\n");
+			return 1;
+		default:
+			printf ("%s[%d] FIXME: rc=%d\n",__FILE__,__LINE__,rc);
+			return 1;
+		}
+		puts ("done\n");
+		return 0;
+	}
+#endif
+
 	while (count-- > 0) {
 		if (size == 4)
 			*((ulong  *)dest) = *((ulong  *)addr);
@@ -820,30 +863,29 @@
 
 int do_mem_crc (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 {
-	ulong	addr, length;
-	ulong	crc;
-	ulong   *ptr;
+	ulong addr, length;
+	ulong crc;
+	ulong *ptr;
 
 	if (argc < 3) {
 		printf ("Usage:\n%s\n", cmdtp->usage);
 		return 1;
 	}
 
-	addr = simple_strtoul(argv[1], NULL, 16);
+	addr = simple_strtoul (argv[1], NULL, 16);
 	addr += base_address;
 
-	length = simple_strtoul(argv[2], NULL, 16);
+	length = simple_strtoul (argv[2], NULL, 16);
 
-	crc = crc32 (0, (const uchar *)addr, length);
+	crc = crc32 (0, (const uchar *) addr, length);
 
 	printf ("CRC32 for %08lx ... %08lx ==> %08lx\n",
-		addr, addr + length -1, crc);
+			addr, addr + length - 1, crc);
 
-	if (argc > 3)
-	  {
-	    ptr = (ulong *)simple_strtoul(argv[3], NULL, 16);
-	    *ptr = crc;
-	  }
+	if (argc > 3) {
+		ptr = (ulong *) simple_strtoul (argv[3], NULL, 16);
+		*ptr = crc;
+	}
 
 	return 0;
 }
diff --git a/common/cmd_mmc.c b/common/cmd_mmc.c
new file mode 100644
index 0000000..45b5064
--- /dev/null
+++ b/common/cmd_mmc.c
@@ -0,0 +1,40 @@
+/*
+ * (C) Copyright 2003
+ * Kyle Harris, kharris@nexus-tech.net
+ *
+ * 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
+ */
+
+#include <common.h>
+#include <command.h>
+
+#if (CONFIG_COMMANDS & CFG_CMD_MMC)
+
+#include <mmc.h>
+
+int do_mmc (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+{
+	if (mmc_init (1) != 0) {
+		printf ("No MMC card found\n");
+		return 1;
+	}
+	return 0;
+}
+
+#endif	/* CFG_CMD_MMC */
diff --git a/common/command.c b/common/command.c
index d52ddf1..842e784 100644
--- a/common/command.c
+++ b/common/command.c
@@ -74,6 +74,8 @@
 #include <cmd_fdos.h>
 #include <cmd_bmp.h>
 #include <cmd_portio.h>
+#include <cmd_mmc.h>
+#include <cmd_fat.h>
 
 #ifdef CONFIG_AMIGAONEG3SE
 #include <cmd_menu.h>
@@ -131,13 +133,14 @@
 
 		if (i > 1)
 			putc(' ');
-		while ((c = *p++) != '\0')
+		while ((c = *p++) != '\0') {
 			if (c == '\\' && *p == 'c') {
 				putnl = 0;
 				p++;
-			}
-			else
+			} else {
 				putc(c);
+			}
+		}
 	}
 
 	if (putnl)
@@ -190,8 +193,7 @@
 			if (cmdtp->usage)
 				puts (cmdtp->usage);
 #endif	/* CFG_LONGHELP */
-		}
-		else {
+		} else {
 			printf ("Unknown command '%s' - try 'help'"
 				" without arguments for list of all"
 				" known commands\n\n",
@@ -263,6 +265,7 @@
 	CMD_TBL_DTT
 	CMD_TBL_ECHO
 	CMD_TBL_EEPROM
+	CMD_TBL_FAT
 	CMD_TBL_FCCINFO
 	CMD_TBL_FLERASE
 	CMD_TBL_FDC
@@ -302,6 +305,7 @@
 	CMD_TBL_LOOP
 	CMD_TBL_JFFS2_LS
 	CMD_TBL_MCCINFO
+	CMD_TBL_MMC
 	CMD_TBL_MD
 	CMD_TBL_MEMCINFO
 #ifdef CONFIG_AMIGAONEG3SE