diff options
| -rw-r--r-- | CHANGELOG | 14 | ||||
| -rw-r--r-- | Makefile | 4 | ||||
| -rw-r--r-- | common/cmd_ide.c | 333 | ||||
| -rw-r--r-- | common/cmd_scsi.c | 50 | ||||
| -rw-r--r-- | common/cmd_usb.c | 35 | ||||
| -rw-r--r-- | include/configs/CPC45.h | 3 | 
6 files changed, 220 insertions, 219 deletions
| @@ -2,6 +2,20 @@  Changes for U-Boot 1.1.3:  ====================================================================== +* Removed '--no-warn-mismatch' option from Makefile. This option +  makes 'ld' to overlook binary objects compatibility. + +* Moved $(PLATFORM_LIBS) from the library group (--start-group ... +  --end-group) outside of the group. This will make 'ld' to do +  _multiple_ search in the library group when resolving symbol +  references and do only a _single_ seach in libgcc.a after the group +  search. + +* Fix stability problems on CPC45 board again. + +* Make image detection for diskboot / usbboot / scsiboot more robust +  (also check header checksum) +  * Update CPC45 board configuration.  * Add USB and PCI support for INKA4x0 board @@ -121,7 +121,7 @@ LIBS += common/libcommon.a  .PHONY : $(LIBS)  # Add GCC lib -PLATFORM_LIBS += --no-warn-mismatch -L $(shell dirname `$(CC) $(CFLAGS) -print-libgcc-file-name`) -lgcc +PLATFORM_LIBS += -L $(shell dirname `$(CC) $(CFLAGS) -print-libgcc-file-name`) -lgcc  # The "tools" are needed early, so put this first @@ -161,7 +161,7 @@ u-boot.dis:	u-boot  u-boot:		depend $(SUBDIRS) $(OBJS) $(LIBS) $(LDSCRIPT)  		UNDEF_SYM=`$(OBJDUMP) -x $(LIBS) |sed  -n -e 's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\  		$(LD) $(LDFLAGS) $$UNDEF_SYM $(OBJS) \ -			--start-group $(LIBS) $(PLATFORM_LIBS) --end-group \ +			--start-group $(LIBS) --end-group $(PLATFORM_LIBS) \  			-Map u-boot.map -o u-boot  $(LIBS): diff --git a/common/cmd_ide.c b/common/cmd_ide.c index b8e0bef57..915ee7636 100644 --- a/common/cmd_ide.c +++ b/common/cmd_ide.c @@ -1,5 +1,5 @@  /* - * (C) Copyright 2000-2004 + * (C) Copyright 2000-2005   * Wolfgang Denk, DENX Software Engineering, wd@denx.de.   *   * See file CREDITS for list of people who contributed to this @@ -62,17 +62,10 @@ static unsigned long mips_io_port_base = 0;  #ifdef __PPC__  # define EIEIO		__asm__ volatile ("eieio") +# define SYNC		__asm__ volatile ("sync")  #else  # define EIEIO		/* nothing */ -#endif - -#undef	IDE_DEBUG - - -#ifdef	IDE_DEBUG -#define	PRINTF(fmt,args...)	printf (fmt ,##args) -#else -#define PRINTF(fmt,args...) +# define SYNC		/* nothing */  #endif  #if (CONFIG_COMMANDS & CFG_CMD_IDE) @@ -135,9 +128,9 @@ ulong ide_bus_offset[CFG_IDE_MAXBUS] = {  #define	ATA_CURR_BASE(dev)	(CFG_ATA_BASE_ADDR+ide_bus_offset[IDE_BUS(dev)])  #ifndef CONFIG_AMIGAONEG3SE -static int	    ide_bus_ok[CFG_IDE_MAXBUS]; +static int ide_bus_ok[CFG_IDE_MAXBUS];  #else -static int	    ide_bus_ok[CFG_IDE_MAXBUS] = {0,}; +static int ide_bus_ok[CFG_IDE_MAXBUS] = {0,};  #endif  block_dev_desc_t ide_dev_desc[CFG_IDE_MAXDEVICE]; @@ -374,8 +367,7 @@ int do_diskboot (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  	char *boot_device = NULL;  	char *ep;  	int dev, part = 0; -	ulong cnt; -	ulong addr; +	ulong addr, cnt, checksum;  	disk_partition_t info;  	image_header_t *hdr;  	int rcode = 0; @@ -438,7 +430,7 @@ int do_diskboot (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  		"Name: %.32s  Type: %.32s\n",  		dev, part, info.name, info.type); -	PRINTF ("First Block: %ld,  # of blocks: %ld, Block Size: %ld\n", +	debug ("First Block: %ld,  # of blocks: %ld, Block Size: %ld\n",  		info.start, info.size, info.blksz);  	if (ide_dev_desc[dev].block_read (dev, info.start, 1, (ulong *)addr) != 1) { @@ -449,20 +441,28 @@ int do_diskboot (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  	hdr = (image_header_t *)addr; -	if (ntohl(hdr->ih_magic) == IH_MAGIC) { - -		print_image_hdr (hdr); - -		cnt = (ntohl(hdr->ih_size) + sizeof(image_header_t)); -		cnt += info.blksz - 1; -		cnt /= info.blksz; -		cnt -= 1; -	} else { +	if (ntohl(hdr->ih_magic) != IH_MAGIC) {  		printf("\n** Bad Magic Number **\n");  		SHOW_BOOT_PROGRESS (-1);  		return 1;  	} +	checksum = ntohl(hdr->ih_hcrc); +	hdr->ih_hcrc = 0; + +	if (crc32 (0, (char *)&hdr, sizeof(image_header_t)) != checksum) { +		puts ("\n** Bad Header Checksum **\n"); +		SHOW_BOOT_PROGRESS (-2); +		return 1; +	} + +	print_image_hdr (hdr); + +	cnt = (ntohl(hdr->ih_size) + sizeof(image_header_t)); +	cnt += info.blksz - 1; +	cnt /= info.blksz; +	cnt -= 1; +  	if (ide_dev_desc[dev].block_read (dev, info.start+1, cnt,  		      (ulong *)(addr+info.blksz)) != cnt) {  		printf ("** Read error on %d:%d\n", dev, part); @@ -542,19 +542,19 @@ void ide_init (void)  #ifdef CONFIG_IDE_8xx_DIRECT  	/* Initialize PIO timing tables */  	for (i=0; i <= IDE_MAX_PIO_MODE; ++i) { -	    pio_config_clk[i].t_setup  = PCMCIA_MK_CLKS(pio_config_ns[i].t_setup, -							    gd->bus_clk); -	    pio_config_clk[i].t_length = PCMCIA_MK_CLKS(pio_config_ns[i].t_length, -							    gd->bus_clk); -	    pio_config_clk[i].t_hold   = PCMCIA_MK_CLKS(pio_config_ns[i].t_hold, -							    gd->bus_clk); -	    PRINTF ("PIO Mode %d: setup=%2d ns/%d clk" -		    "  len=%3d ns/%d clk" -		    "  hold=%2d ns/%d clk\n", -		    i, -		    pio_config_ns[i].t_setup,  pio_config_clk[i].t_setup, -		    pio_config_ns[i].t_length, pio_config_clk[i].t_length, -		    pio_config_ns[i].t_hold,   pio_config_clk[i].t_hold); +		pio_config_clk[i].t_setup  = PCMCIA_MK_CLKS(pio_config_ns[i].t_setup, +								gd->bus_clk); +		pio_config_clk[i].t_length = PCMCIA_MK_CLKS(pio_config_ns[i].t_length, +								gd->bus_clk); +		pio_config_clk[i].t_hold   = PCMCIA_MK_CLKS(pio_config_ns[i].t_hold, +								gd->bus_clk); +		debug ( "PIO Mode %d: setup=%2d ns/%d clk" +			"  len=%3d ns/%d clk" +			"  hold=%2d ns/%d clk\n", +			i, +			pio_config_ns[i].t_setup,  pio_config_clk[i].t_setup, +			pio_config_ns[i].t_length, pio_config_clk[i].t_length, +			pio_config_ns[i].t_hold,   pio_config_clk[i].t_hold);  	}  #endif /* CONFIG_IDE_8xx_DIRECT */ @@ -583,9 +583,9 @@ void ide_init (void)  #else  	s = getenv("ide_maxbus");  	if (s) -	    max_bus_scan = simple_strtol(s, NULL, 10); +		max_bus_scan = simple_strtol(s, NULL, 10);  	else -	    max_bus_scan = CFG_IDE_MAXBUS; +		max_bus_scan = CFG_IDE_MAXBUS;  	for (bus=0; bus<max_bus_scan; ++bus) {  		int dev = bus * (CFG_IDE_MAXDEVICE / max_bus_scan); @@ -628,8 +628,8 @@ void ide_init (void)  #ifdef CONFIG_AMIGAONEG3SE  				/* If this is the second bus, the first one was OK */  				if (bus != 0) { -				    ide_bus_ok[bus] = 0; -				    goto skip_bus; +					ide_bus_ok[bus] = 0; +					goto skip_bus;  				}  #endif  				return; @@ -641,11 +641,11 @@ void ide_init (void)  		if (c & (ATA_STAT_BUSY | ATA_STAT_FAULT)) {  			puts ("not available  "); -			PRINTF ("Status = 0x%02X ", c); +			debug ("Status = 0x%02X ", c);  #ifndef CONFIG_ATAPI /* ATAPI Devices do not set DRDY */  		} else  if ((c & ATA_STAT_READY) == 0) {  			puts ("not available  "); -			PRINTF ("Status = 0x%02X ", c); +			debug ("Status = 0x%02X ", c);  #endif  		} else {  			puts ("OK "); @@ -706,7 +706,7 @@ set_pcmcia_timing (int pmode)  	volatile pcmconf8xx_t *pcmp = &(immr->im_pcmcia);  	ulong timings; -	PRINTF ("Set timing for PIO Mode %d\n", pmode); +	debug ("Set timing for PIO Mode %d\n", pmode);  	timings = PCMCIA_SHT(pio_config_clk[pmode].t_hold)  		| PCMCIA_SST(pio_config_clk[pmode].t_setup) @@ -721,7 +721,7 @@ set_pcmcia_timing (int pmode)  			| timings  #endif  			; -	PRINTF ("PBR0: %08x  POR0: %08x\n", pcmp->pcmc_pbr0, pcmp->pcmc_por0); +	debug ("PBR0: %08x  POR0: %08x\n", pcmp->pcmc_pbr0, pcmp->pcmc_por0);  	pcmp->pcmc_pbr1 = CFG_PCMCIA_PBR1;  	pcmp->pcmc_por1 = CFG_PCMCIA_POR1 @@ -729,7 +729,7 @@ set_pcmcia_timing (int pmode)  			| timings  #endif  			; -	PRINTF ("PBR1: %08x  POR1: %08x\n", pcmp->pcmc_pbr1, pcmp->pcmc_por1); +	debug ("PBR1: %08x  POR1: %08x\n", pcmp->pcmc_pbr1, pcmp->pcmc_por1);  	pcmp->pcmc_pbr2 = CFG_PCMCIA_PBR2;  	pcmp->pcmc_por2 = CFG_PCMCIA_POR2 @@ -737,7 +737,7 @@ set_pcmcia_timing (int pmode)  			| timings  #endif  			; -	PRINTF ("PBR2: %08x  POR2: %08x\n", pcmp->pcmc_pbr2, pcmp->pcmc_por2); +	debug ("PBR2: %08x  POR2: %08x\n", pcmp->pcmc_pbr2, pcmp->pcmc_por2);  	pcmp->pcmc_pbr3 = CFG_PCMCIA_PBR3;  	pcmp->pcmc_por3 = CFG_PCMCIA_POR3 @@ -745,7 +745,7 @@ set_pcmcia_timing (int pmode)  			| timings  #endif  			; -	PRINTF ("PBR3: %08x  POR3: %08x\n", pcmp->pcmc_pbr3, pcmp->pcmc_por3); +	debug ("PBR3: %08x  POR3: %08x\n", pcmp->pcmc_pbr3, pcmp->pcmc_por3);  	/* IDE 1  	 */ @@ -755,7 +755,7 @@ set_pcmcia_timing (int pmode)  			| timings  #endif  			; -	PRINTF ("PBR4: %08x  POR4: %08x\n", pcmp->pcmc_pbr4, pcmp->pcmc_por4); +	debug ("PBR4: %08x  POR4: %08x\n", pcmp->pcmc_pbr4, pcmp->pcmc_por4);  	pcmp->pcmc_pbr5 = CFG_PCMCIA_PBR5;  	pcmp->pcmc_por5 = CFG_PCMCIA_POR5 @@ -763,7 +763,7 @@ set_pcmcia_timing (int pmode)  			| timings  #endif  			; -	PRINTF ("PBR5: %08x  POR5: %08x\n", pcmp->pcmc_pbr5, pcmp->pcmc_por5); +	debug ("PBR5: %08x  POR5: %08x\n", pcmp->pcmc_pbr5, pcmp->pcmc_por5);  	pcmp->pcmc_pbr6 = CFG_PCMCIA_PBR6;  	pcmp->pcmc_por6 = CFG_PCMCIA_POR6 @@ -771,7 +771,7 @@ set_pcmcia_timing (int pmode)  			| timings  #endif  			; -	PRINTF ("PBR6: %08x  POR6: %08x\n", pcmp->pcmc_pbr6, pcmp->pcmc_por6); +	debug ("PBR6: %08x  POR6: %08x\n", pcmp->pcmc_pbr6, pcmp->pcmc_por6);  	pcmp->pcmc_pbr7 = CFG_PCMCIA_PBR7;  	pcmp->pcmc_por7 = CFG_PCMCIA_POR7 @@ -779,7 +779,7 @@ set_pcmcia_timing (int pmode)  			| timings  #endif  			; -	PRINTF ("PBR7: %08x  POR7: %08x\n", pcmp->pcmc_pbr7, pcmp->pcmc_por7); +	debug ("PBR7: %08x  POR7: %08x\n", pcmp->pcmc_pbr7, pcmp->pcmc_por7);  } @@ -791,7 +791,7 @@ set_pcmcia_timing (int pmode)  static void __inline__  ide_outb(int dev, int port, unsigned char val)  { -	PRINTF ("ide_outb (dev= %d, port= 0x%x, val= 0x%02x) : @ 0x%08lx\n", +	debug ("ide_outb (dev= %d, port= 0x%x, val= 0x%02x) : @ 0x%08lx\n",  		dev, port, val, (ATA_CURR_BASE(dev)+port));  	/* Ensure I/O operations complete */ @@ -815,7 +815,7 @@ ide_inb(int dev, int port)  	/* Ensure I/O operations complete */  	EIEIO;  	val = *((uchar *)(ATA_CURR_BASE(dev)+port)); -	PRINTF ("ide_inb (dev= %d, port= 0x%x) : @ 0x%08lx -> 0x%02x\n", +	debug ("ide_inb (dev= %d, port= 0x%x) : @ 0x%08lx -> 0x%02x\n",  		dev, port, (ATA_CURR_BASE(dev)+port), val);  	return (val);  } @@ -844,7 +844,7 @@ output_data_short(int dev, ulong *sect_buf, int words)  	}  	if (words&1) -	    *pbuf = 0; +		*pbuf = 0;  }  # endif	/* CONFIG_AMIGAONEG3SE */  #endif /* __PPC_ */ @@ -857,17 +857,7 @@ output_data_short(int dev, ulong *sect_buf, int words)  static void  input_swap_data(int dev, ulong *sect_buf, int words)  { -#ifndef CONFIG_HMI10 -	volatile ushort	*pbuf = (ushort *)(ATA_CURR_BASE(dev)+ATA_DATA_REG); -	ushort	*dbuf = (ushort *)sect_buf; - -	PRINTF("in input swap data base for read is %lx\n", (unsigned long) pbuf); - -	while (words--) { -		*dbuf++ = ld_le16(pbuf); -		*dbuf++ = ld_le16(pbuf); -	} -#else	/* CONFIG_HMI10 */ +#if defined(CONFIG_HMI10) || defined(CONFIG_CPC45)  	uchar i;  	volatile uchar *pbuf_even = (uchar *)(ATA_CURR_BASE(dev)+ATA_DATA_EVEN);  	volatile uchar *pbuf_odd  = (uchar *)(ATA_CURR_BASE(dev)+ATA_DATA_ODD); @@ -880,7 +870,17 @@ input_swap_data(int dev, ulong *sect_buf, int words)  			dbuf+=1;  		}  	} -#endif	/* CONFIG_HMI10 */ +#else	 +	volatile ushort	*pbuf = (ushort *)(ATA_CURR_BASE(dev)+ATA_DATA_REG); +	ushort	*dbuf = (ushort *)sect_buf; + +	debug("in input swap data base for read is %lx\n", (unsigned long) pbuf); + +	while (words--) { +		*dbuf++ = ld_le16(pbuf); +		*dbuf++ = ld_le16(pbuf); +	} +#endif  }  #endif	/* __LITTLE_ENDIAN || CONFIG_AU1X00 */ @@ -889,19 +889,7 @@ input_swap_data(int dev, ulong *sect_buf, int words)  static void  output_data(int dev, ulong *sect_buf, int words)  { -#ifndef CONFIG_HMI10 -	ushort	*dbuf; -	volatile ushort	*pbuf; - -	pbuf = (ushort *)(ATA_CURR_BASE(dev)+ATA_DATA_REG); -	dbuf = (ushort *)sect_buf; -	while (words--) { -		EIEIO; -		*pbuf = *dbuf++; -		EIEIO; -		*pbuf = *dbuf++; -	} -#else	/* CONFIG_HMI10 */ +#if defined(CONFIG_HMI10) || defined(CONFIG_CPC45)  	uchar	*dbuf;  	volatile uchar	*pbuf_even;  	volatile uchar	*pbuf_odd; @@ -919,7 +907,19 @@ output_data(int dev, ulong *sect_buf, int words)  		EIEIO;  		*pbuf_odd = *dbuf++;  	} -#endif	/* CONFIG_HMI10 */ +#else +	ushort	*dbuf; +	volatile ushort	*pbuf; + +	pbuf = (ushort *)(ATA_CURR_BASE(dev)+ATA_DATA_REG); +	dbuf = (ushort *)sect_buf; +	while (words--) { +		EIEIO; +		*pbuf = *dbuf++; +		EIEIO; +		*pbuf = *dbuf++; +	} +#endif  }  #else	/* ! __PPC__ */  static void @@ -933,22 +933,7 @@ output_data(int dev, ulong *sect_buf, int words)  static void  input_data(int dev, ulong *sect_buf, int words)  { -#ifndef CONFIG_HMI10 -	ushort	*dbuf; -	volatile ushort	*pbuf; - -	pbuf = (ushort *)(ATA_CURR_BASE(dev)+ATA_DATA_REG); -	dbuf = (ushort *)sect_buf; - -	PRINTF("in input data base for read is %lx\n", (unsigned long) pbuf); - -	while (words--) { -		EIEIO; -		*dbuf++ = *pbuf; -		EIEIO; -		*dbuf++ = *pbuf; -	} -#else	/* CONFIG_HMI10 */ +#if defined(CONFIG_HMI10) || defined(CONFIG_CPC45)  	uchar	*dbuf;  	volatile uchar	*pbuf_even;  	volatile uchar	*pbuf_odd; @@ -957,20 +942,35 @@ input_data(int dev, ulong *sect_buf, int words)  	pbuf_odd  = (uchar *)(ATA_CURR_BASE(dev)+ATA_DATA_ODD);  	dbuf = (uchar *)sect_buf;  	while (words--) { +		*dbuf++ = *pbuf_even;  		EIEIO; +		SYNC; +		*dbuf++ = *pbuf_odd;  		EIEIO; +		SYNC;  		*dbuf++ = *pbuf_even;  		EIEIO; -		EIEIO; +		SYNC;  		*dbuf++ = *pbuf_odd;  		EIEIO; +		SYNC; +	} +#else +	ushort	*dbuf; +	volatile ushort	*pbuf; + +	pbuf = (ushort *)(ATA_CURR_BASE(dev)+ATA_DATA_REG); +	dbuf = (ushort *)sect_buf; + +	debug("in input data base for read is %lx\n", (unsigned long) pbuf); + +	while (words--) {  		EIEIO; -		*dbuf++ = *pbuf_even; -		EIEIO; +		*dbuf++ = *pbuf;  		EIEIO; -		*dbuf++ = *pbuf_odd; +		*dbuf++ = *pbuf;  	} -#endif	/* CONFIG_HMI10 */ +#endif  }  #else	/* ! __PPC__ */  static void @@ -997,8 +997,8 @@ input_data_short(int dev, ulong *sect_buf, int words)  	}  	if (words&1) { -	    ushort dummy; -	    dummy = *pbuf; +		ushort dummy; +		dummy = *pbuf;  	}  }  #endif @@ -1087,14 +1087,14 @@ static void ide_ident (block_dev_desc_t *dev_desc)  		s = getenv("ide_doreset");  		if (s && strcmp(s, "on") == 0)  #endif -			{ -				/* Need to soft reset the device in case it's an ATAPI...  */ -				PRINTF("Retrying...\n"); -				ide_outb (device, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(device)); -				udelay(100000); -				ide_outb (device, ATA_COMMAND, 0x08); -				udelay (500000);	/* 500 ms */ -			} +		{ +			/* Need to soft reset the device in case it's an ATAPI...  */ +			debug ("Retrying...\n"); +			ide_outb (device, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(device)); +			udelay(100000); +			ide_outb (device, ATA_COMMAND, 0x08); +			udelay (500000);	/* 500 ms */ +		}  		/* Select device  		 */  		ide_outb (device, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(device)); @@ -1144,16 +1144,16 @@ static void ide_ident (block_dev_desc_t *dev_desc)  	printf ("tPIO = 0x%02x = %d\n",mode, mode);  	if (mode > 2) {		/* 2 is maximum allowed tPIO value */  		mode = 2; -		PRINTF ("Override tPIO -> 2\n"); +		debug ("Override tPIO -> 2\n");  	}  	if (iop->field_valid & 2) {	/* drive implements ATA2? */ -		PRINTF ("Drive implements ATA2\n"); +		debug ("Drive implements ATA2\n");  		if (iop->capability & 8) {	/* drive supports use_iordy? */  			cycle_time = iop->eide_pio_iordy;  		} else {  			cycle_time = iop->eide_pio;  		} -		PRINTF ("cycle time = %d\n", cycle_time); +		debug ("cycle time = %d\n", cycle_time);  		mode = 4;  		if (cycle_time > 120) mode = 3;	/* 120 ns for PIO mode 4 */  		if (cycle_time > 180) mode = 2;	/* 180 ns for PIO mode 3 */ @@ -1208,8 +1208,7 @@ static void ide_ident (block_dev_desc_t *dev_desc)  	ide_outb (device, ATA_LBA_LOW,  0);  	ide_outb (device, ATA_LBA_MID,  0);  	ide_outb (device, ATA_LBA_HIGH, 0); -	ide_outb (device, ATA_DEV_HD,   ATA_LBA		| -				    ATA_DEVICE(device)); +	ide_outb (device, ATA_DEV_HD,   ATA_LBA | ATA_DEVICE(device));  	ide_outb (device, ATA_COMMAND,  0xe3);  	udelay (50);  	c = ide_wait (device, IDE_TIME_OUT);	/* can't take over 500 ms */ @@ -1232,7 +1231,7 @@ ulong ide_read (int device, lbaint_t blknr, ulong blkcnt, ulong *buffer)  		lba48 = 1;  	}  #endif -	PRINTF ("ide_read dev %d start %qX, blocks %lX buffer at %lX\n", +	debug ("ide_read dev %d start %qX, blocks %lX buffer at %lX\n",  		device, blknr, blkcnt, (ulong)buffer);  	ide_led (DEVICE_LED(device), 1);	/* LED on	*/ @@ -1262,7 +1261,7 @@ ulong ide_read (int device, lbaint_t blknr, ulong blkcnt, ulong *buffer)  		printf ("No Powersaving mode %X\n", c);  	} else {  		c = ide_inb(device,ATA_SECT_CNT); -		PRINTF("Powersaving %02X\n",c); +		debug ("Powersaving %02X\n",c);  		if(c==0)  			pwrsave=1;  	} @@ -1583,34 +1582,13 @@ static void ide_led (uchar led, uchar status)   * ATAPI Support   */ -#undef	ATAPI_DEBUG - -#ifdef	ATAPI_DEBUG -#define	AT_PRINTF(fmt,args...)	printf (fmt ,##args) -#else -#define AT_PRINTF(fmt,args...) -#endif -  #if defined(__PPC__) || defined(CONFIG_PXA_PCMCIA)  /* since ATAPI may use commands with not 4 bytes alligned length   * we have our own transfer functions, 2 bytes alligned */  static void  output_data_shorts(int dev, ushort *sect_buf, int shorts)  { -#ifndef CONFIG_HMI10 -	ushort	*dbuf; -	volatile ushort	*pbuf; - -	pbuf = (ushort *)(ATA_CURR_BASE(dev)+ATA_DATA_REG); -	dbuf = (ushort *)sect_buf; - -	PRINTF("in output data shorts base for read is %lx\n", (unsigned long) pbuf); - -	while (shorts--) { -		EIEIO; -		*pbuf = *dbuf++; -	} -#else	/* CONFIG_HMI10 */ +#if defined(CONFIG_HMI10) || defined(CONFIG_CPC45)  	uchar	*dbuf;  	volatile uchar	*pbuf_even;  	volatile uchar	*pbuf_odd; @@ -1623,26 +1601,26 @@ output_data_shorts(int dev, ushort *sect_buf, int shorts)  		EIEIO;  		*pbuf_odd = *dbuf++;  	} -#endif	/* CONFIG_HMI10 */ -} - -static void -input_data_shorts(int dev, ushort *sect_buf, int shorts) -{ -#ifndef CONFIG_HMI10 +#else  	ushort	*dbuf;  	volatile ushort	*pbuf;  	pbuf = (ushort *)(ATA_CURR_BASE(dev)+ATA_DATA_REG);  	dbuf = (ushort *)sect_buf; -	PRINTF("in input data shorts base for read is %lx\n", (unsigned long) pbuf); +	debug ("in output data shorts base for read is %lx\n", (unsigned long) pbuf);  	while (shorts--) {  		EIEIO; -		*dbuf++ = *pbuf; +		*pbuf = *dbuf++;  	} -#else	/* CONFIG_HMI10 */ +#endif +} + +static void +input_data_shorts(int dev, ushort *sect_buf, int shorts) +{ +#if defined(CONFIG_HMI10) || defined(CONFIG_CPC45)  	uchar	*dbuf;  	volatile uchar	*pbuf_even;  	volatile uchar	*pbuf_odd; @@ -1655,7 +1633,20 @@ input_data_shorts(int dev, ushort *sect_buf, int shorts)  		EIEIO;  		*dbuf++ = *pbuf_odd;  	} -#endif	/* CONFIG_HMI10 */ +#else +	ushort	*dbuf; +	volatile ushort	*pbuf; + +	pbuf = (ushort *)(ATA_CURR_BASE(dev)+ATA_DATA_REG); +	dbuf = (ushort *)sect_buf; + +	debug("in input data shorts base for read is %lx\n", (unsigned long) pbuf); + +	while (shorts--) { +		EIEIO; +		*dbuf++ = *pbuf; +	} +#endif  }  #else	/* ! __PPC__ */ @@ -1758,7 +1749,7 @@ unsigned char atapi_issue(int device,unsigned char* ccb,int ccblen, unsigned cha  	if ((c & mask) != res ) {  		if (c & ATA_STAT_ERR) {  			err=(ide_inb(device,ATA_ERROR_REG))>>4; -			AT_PRINTF("atapi_issue 1 returned sense key %X status %02X\n",err,c); +			debug ("atapi_issue 1 returned sense key %X status %02X\n",err,c);  		} else {  			printf ("ATTAPI_ISSUE: (no DRQ) after sending ccb (%x)  status 0x%02x\n", ccb[0],c);  			err=0xFF; @@ -1779,18 +1770,18 @@ unsigned char atapi_issue(int device,unsigned char* ccb,int ccblen, unsigned cha  		goto AI_OUT;  	}  	if(n!=buflen) { -		AT_PRINTF("WARNING, transfer bytes %d not equal with requested %d\n",n,buflen); +		debug ("WARNING, transfer bytes %d not equal with requested %d\n",n,buflen);  	}  	if(n!=0) { /* data transfer */ -		AT_PRINTF("ATAPI_ISSUE: %d Bytes to transfer\n",n); +		debug ("ATAPI_ISSUE: %d Bytes to transfer\n",n);  		 /* we transfer shorts */  		n>>=1;  		/* ok now decide if it is an in or output */  		if ((ide_inb(device, ATA_SECT_CNT)&0x02)==0) { -			AT_PRINTF("Write to device\n"); +			debug ("Write to device\n");  			output_data_shorts(device,(unsigned short *)buffer,n);  		} else { -			AT_PRINTF("Read from device @ %p shorts %d\n",buffer,n); +			debug ("Read from device @ %p shorts %d\n",buffer,n);  			input_data_shorts(device,(unsigned short *)buffer,n);  		}  	} @@ -1800,7 +1791,7 @@ unsigned char atapi_issue(int device,unsigned char* ccb,int ccblen, unsigned cha  	c = atapi_wait_mask(device,ATAPI_TIME_OUT,mask,res);  	if ((c & ATA_STAT_ERR) == ATA_STAT_ERR) {  		err=(ide_inb(device,ATA_ERROR_REG) >> 4); -		AT_PRINTF("atapi_issue 2 returned sense key %X status %X\n",err,c); +		debug ("atapi_issue 2 returned sense key %X status %X\n",err,c);  	} else {  		err = 0;  	} @@ -1848,7 +1839,7 @@ retry:  	if (res==0xFF)  		return (0xFF); /* error */ -	AT_PRINTF("(auto_req)atapi_issue returned sense key %X\n",res); +	debug ("(auto_req)atapi_issue returned sense key %X\n",res);  	memset(sense_ccb,0,sizeof(sense_ccb));  	memset(sense_data,0,sizeof(sense_data)); @@ -1860,8 +1851,8 @@ retry:  	asc=(sense_data[12]);  	ascq=(sense_data[13]); -	AT_PRINTF("ATAPI_CMD_REQ_SENSE returned %x\n",res); -	AT_PRINTF(" Sense page: %02X key %02X ASC %02X ASCQ %02X\n", +	debug ("ATAPI_CMD_REQ_SENSE returned %x\n",res); +	debug (" Sense page: %02X key %02X ASC %02X ASCQ %02X\n",  		sense_data[0],  		key,  		asc, @@ -1887,13 +1878,13 @@ retry:  		goto error;  	}  	if(asc==0x3a) { -		AT_PRINTF("Media not present\n"); +		debug ("Media not present\n");  		goto error;  	}  #ifdef CONFIG_AMIGAONEG3SE  	if ((sense_data[2]&0xF)==0x0B) { -		AT_PRINTF("ABORTED COMMAND...retry\n"); +		debug ("ABORTED COMMAND...retry\n");  		if (retrycnt++ < 4)  			goto retry;  		return (0xFF); @@ -1902,7 +1893,7 @@ retry:  	if ((sense_data[2]&0xf) == 0x02 &&  	    sense_data[12] == 0x04	&&  	    sense_data[13] == 0x01	) { -		AT_PRINTF("Waiting for unit to become active\n"); +		debug ("Waiting for unit to become active\n");  		udelay(timeout);  		if (retrycnt++ < 4)  			goto retry; @@ -1912,7 +1903,7 @@ retry:  	printf ("ERROR: Unknown Sense key %02X ASC %02X ASCQ %02X\n",key,asc,ascq);  error: -	AT_PRINTF ("ERROR Sense key %02X ASC %02X ASCQ %02X\n",key,asc,ascq); +	debug  ("ERROR Sense key %02X ASC %02X ASCQ %02X\n",key,asc,ascq);  	return (0xFF);  } @@ -1935,7 +1926,7 @@ static void	atapi_inquiry(block_dev_desc_t * dev_desc)  	ccb[4]=40; /* allocation Legnth */  	c=atapi_issue_autoreq(device,ccb,12,(unsigned char *)iobuf,40); -	AT_PRINTF("ATAPI_CMD_INQUIRY returned %x\n",c); +	debug ("ATAPI_CMD_INQUIRY returned %x\n",c);  	if (c!=0)  		return; @@ -1961,7 +1952,7 @@ static void	atapi_inquiry(block_dev_desc_t * dev_desc)  	c=atapi_issue_autoreq(device,ccb,12,(unsigned char *)iobuf,0); -	AT_PRINTF("ATAPI_CMD_START_STOP returned %x\n",c); +	debug ("ATAPI_CMD_START_STOP returned %x\n",c);  	if (c!=0)  		return; @@ -1969,7 +1960,7 @@ static void	atapi_inquiry(block_dev_desc_t * dev_desc)  	memset(iobuf,0,sizeof(iobuf));  	c=atapi_issue_autoreq(device,ccb,12,(unsigned char *)iobuf,0); -	AT_PRINTF("ATAPI_CMD_UNIT_TEST_READY returned %x\n",c); +	debug ("ATAPI_CMD_UNIT_TEST_READY returned %x\n",c);  	if (c!=0)  		return; @@ -1977,11 +1968,11 @@ static void	atapi_inquiry(block_dev_desc_t * dev_desc)  	memset(iobuf,0,sizeof(iobuf));  	ccb[0]=ATAPI_CMD_READ_CAP;  	c=atapi_issue_autoreq(device,ccb,12,(unsigned char *)iobuf,8); -	AT_PRINTF("ATAPI_CMD_READ_CAP returned %x\n",c); +	debug ("ATAPI_CMD_READ_CAP returned %x\n",c);  	if (c!=0)  		return; -	AT_PRINTF("Read Cap: LBA %02X%02X%02X%02X blksize %02X%02X%02X%02X\n", +	debug ("Read Cap: LBA %02X%02X%02X%02X blksize %02X%02X%02X%02X\n",  		iobuf[0],iobuf[1],iobuf[2],iobuf[3],  		iobuf[4],iobuf[5],iobuf[6],iobuf[7]); @@ -2015,7 +2006,7 @@ ulong atapi_read (int device, lbaint_t blknr, ulong blkcnt, ulong *buffer)  	unsigned char ccb[12]; /* Command descriptor block */  	ulong cnt; -	AT_PRINTF("atapi_read dev %d start %lX, blocks %lX buffer at %lX\n", +	debug  ("atapi_read dev %d start %lX, blocks %lX buffer at %lX\n",  		device, blknr, blkcnt, (ulong)buffer);  	do { diff --git a/common/cmd_scsi.c b/common/cmd_scsi.c index 2da9ac916..062b1c9cb 100644 --- a/common/cmd_scsi.c +++ b/common/cmd_scsi.c @@ -27,7 +27,6 @@  /*   * SCSI support.   */ -  #include <common.h>  #include <command.h>  #include <asm/processor.h> @@ -35,15 +34,6 @@  #include <image.h>  #include <pci.h> - -#undef	SCSI_DEBUG - -#ifdef	SCSI_DEBUG -#define	PRINTF(fmt,args...)	printf (fmt ,##args) -#else -#define PRINTF(fmt,args...) -#endif -  #if (CONFIG_COMMANDS & CFG_CMD_SCSI)  #ifdef CONFIG_SCSI_SYM53C8XX @@ -120,7 +110,7 @@ void scsi_scan(int mode)  			scsi_setup_inquiry(pccb);  			if(scsi_exec(pccb)!=TRUE) {  				if(pccb->contr_stat==SCSI_SEL_TIME_OUT) { -					PRINTF("Selection timeout ID %d\n",pccb->target); +					debug ("Selection timeout ID %d\n",pccb->target);  					continue; /* selection timeout => assuming no device present */  				}  				scsi_print_error(pccb); @@ -211,8 +201,7 @@ int do_scsiboot (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  	char *boot_device = NULL;  	char *ep;  	int dev, part = 0; -	ulong cnt; -	ulong addr; +	ulong addr, cnt, checksum;  	disk_partition_t info;  	image_header_t *hdr;  	int rcode = 0; @@ -270,7 +259,7 @@ int do_scsiboot (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  		"Name: %.32s  Type: %.32s\n",  		dev, part, info.name, info.type); -	PRINTF ("First Block: %ld,  # of blocks: %ld, Block Size: %ld\n", +	debug ("First Block: %ld,  # of blocks: %ld, Block Size: %ld\n",  		info.start, info.size, info.blksz);  	if (scsi_read (dev, info.start, 1, (ulong *)addr) != 1) { @@ -281,17 +270,24 @@ int do_scsiboot (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  	hdr = (image_header_t *)addr;  	if (hdr->ih_magic == IH_MAGIC) { - -		print_image_hdr (hdr); -		cnt = (hdr->ih_size + sizeof(image_header_t)); -		cnt += info.blksz - 1; -		cnt /= info.blksz; -		cnt -= 1; -	} else {  		printf("\n** Bad Magic Number **\n");  		return 1;  	} +	checksum = ntohl(hdr->ih_hcrc); +	hdr->ih_hcrc = 0; + +	if (crc32 (0, (char *)hdr, sizeof(image_header_t)) != checksum) { +		puts ("\n** Bad Header Checksum **\n"); +		return 1; +	} + +	print_image_hdr (hdr); +	cnt = (hdr->ih_size + sizeof(image_header_t)); +	cnt += info.blksz - 1; +	cnt /= info.blksz; +	cnt -= 1; +  	if (scsi_read (dev, info.start+1, cnt,  		      (ulong *)(addr+info.blksz)) != cnt) {  		printf ("** Read error on %d:%d\n", dev, part); @@ -359,7 +355,7 @@ int do_scsi (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  						ok++;  						if (dev)  							printf("\n"); -						PRINTF("print_part of %x\n",dev); +						debug ("print_part of %x\n",dev);  							print_part(&scsi_dev_desc[dev]);  					}  				} @@ -435,7 +431,7 @@ ulong scsi_read(int device, ulong blknr, ulong blkcnt, ulong *buffer)  	buf_addr=(unsigned long)buffer;  	start=blknr;  	blks=blkcnt; -	PRINTF("\nscsi_read: dev %d startblk %lx, blccnt %lx buffer %lx\n",device,start,blks,(unsigned long)buffer); +	debug ("\nscsi_read: dev %d startblk %lx, blccnt %lx buffer %lx\n",device,start,blks,(unsigned long)buffer);  	do {  		pccb->pdata=(unsigned char *)buf_addr;  		if(blks>SCSI_MAX_READ_BLK) { @@ -452,7 +448,7 @@ ulong scsi_read(int device, ulong blknr, ulong blkcnt, ulong *buffer)  			start+=blks;  			blks=0;  		} -		PRINTF("scsi_read_ext: startblk %lx, blccnt %x buffer %lx\n",start,smallblks,buf_addr); +		debug ("scsi_read_ext: startblk %lx, blccnt %x buffer %lx\n",start,smallblks,buf_addr);  		if(scsi_exec(pccb)!=TRUE) {  			scsi_print_error(pccb);  			blkcnt-=blks; @@ -460,7 +456,7 @@ ulong scsi_read(int device, ulong blknr, ulong blkcnt, ulong *buffer)  		}  		buf_addr+=pccb->datalen;  	} while(blks!=0); -	PRINTF("scsi_read_ext: end startblk %lx, blccnt %x buffer %lx\n",start,smallblks,buf_addr); +	debug ("scsi_read_ext: end startblk %lx, blccnt %x buffer %lx\n",start,smallblks,buf_addr);  	return(blkcnt);  } @@ -551,7 +547,7 @@ void scsi_setup_read_ext(ccb * pccb, unsigned long start, unsigned short blocks)  	pccb->cmd[6]=0;  	pccb->cmdlen=10;  	pccb->msgout[0]=SCSI_IDENTIFY; /* NOT USED */ -	PRINTF("scsi_setup_read_ext: cmd: %02X %02X startblk %02X%02X%02X%02X blccnt %02X%02X\n", +	debug ("scsi_setup_read_ext: cmd: %02X %02X startblk %02X%02X%02X%02X blccnt %02X%02X\n",  		pccb->cmd[0],pccb->cmd[1],  		pccb->cmd[2],pccb->cmd[3],pccb->cmd[4],pccb->cmd[5],  		pccb->cmd[7],pccb->cmd[8]); @@ -567,7 +563,7 @@ void scsi_setup_read6(ccb * pccb, unsigned long start, unsigned short blocks)  	pccb->cmd[5]=0;  	pccb->cmdlen=6;  	pccb->msgout[0]=SCSI_IDENTIFY; /* NOT USED */ -	PRINTF("scsi_setup_read6: cmd: %02X %02X startblk %02X%02X blccnt %02X\n", +	debug ("scsi_setup_read6: cmd: %02X %02X startblk %02X%02X blccnt %02X\n",  		pccb->cmd[0],pccb->cmd[1],  		pccb->cmd[2],pccb->cmd[3],pccb->cmd[4]);  } diff --git a/common/cmd_usb.c b/common/cmd_usb.c index 83004b53a..3227db99d 100644 --- a/common/cmd_usb.c +++ b/common/cmd_usb.c @@ -32,13 +32,6 @@  #include <usb.h> -#undef	CMD_USB_DEBUG - -#ifdef	CMD_USB_DEBUG -#define	CMD_USB_PRINTF(fmt,args...)	printf (fmt ,##args) -#else -#define CMD_USB_PRINTF(fmt,args...) -#endif  static int usb_stor_curr_dev=-1; /* current device */  /* some display routines (info command) */ @@ -317,8 +310,7 @@ int do_usbboot (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  	char *boot_device = NULL;  	char *ep;  	int dev, part=0, rcode; -	ulong cnt; -	ulong addr; +	ulong addr, cnt, checksum;  	disk_partition_t info;  	image_header_t *hdr;  	block_dev_desc_t *stor_dev; @@ -385,7 +377,7 @@ int do_usbboot (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  		"Name: %.32s  Type: %.32s\n",  		dev, part, info.name, info.type); -	printf ("First Block: %ld,  # of blocks: %ld, Block Size: %ld\n", +	debug ("First Block: %ld,  # of blocks: %ld, Block Size: %ld\n",  		info.start, info.size, info.blksz);  	if (stor_dev->block_read(dev, info.start, 1, (ulong *)addr) != 1) { @@ -395,17 +387,26 @@ int do_usbboot (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  	hdr = (image_header_t *)addr; -	if (hdr->ih_magic == IH_MAGIC) { -		print_image_hdr (hdr); -		cnt = (hdr->ih_size + sizeof(image_header_t)); -		cnt += info.blksz - 1; -		cnt /= info.blksz; -		cnt -= 1; -	} else { +	if (hdr->ih_magic != IH_MAGIC) {  		printf("\n** Bad Magic Number **\n");  		return 1;  	} +	checksum = ntohl(hdr->ih_hcrc); +	hdr->ih_hcrc = 0; + +	if (crc32 (0, (char *)hdr, sizeof(image_header_t)) != checksum) { +		puts ("\n** Bad Header Checksum **\n"); +		return 1; +	} + +	print_image_hdr (hdr); + +	cnt = (hdr->ih_size + sizeof(image_header_t)); +	cnt += info.blksz - 1; +	cnt /= info.blksz; +	cnt -= 1; +  	if (stor_dev->block_read (dev, info.start+1, cnt,  		      (ulong *)(addr+info.blksz)) != cnt) {  		printf ("\n** Read error on %d:%d\n", dev, part); diff --git a/include/configs/CPC45.h b/include/configs/CPC45.h index 6fb8003cd..aae7d8c4b 100644 --- a/include/configs/CPC45.h +++ b/include/configs/CPC45.h @@ -496,14 +496,13 @@  #define CFG_IDE_MAXDEVICE	1	/* max. 1 drive per IDE bus	*/  #define CFG_ATA_IDE0_OFFSET	0x0000 -#define CONFIG_HMI10  #define CFG_ATA_BASE_ADDR	CFG_PCMCIA_MEM_ADDR  #define CFG_ATA_DATA_OFFSET	CFG_PCMCIA_MEM_SIZE  /* Offset for normal register accesses	*/ -#define CFG_ATA_REG_OFFSET	CFG_PCMCIA_MEM_SIZE +#define CFG_ATA_REG_OFFSET	(CFG_PCMCIA_MEM_SIZE + 0x320)  /* Offset for alternate registers	*/  #define CFG_ATA_ALT_OFFSET	(CFG_PCMCIA_MEM_SIZE + 0x400) |