/*
- * (C) Copyright 2000-2002
+ * (C) Copyright 2000-2004
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
*
* See file CREDITS for list of people who contributed to this
# define SHOW_BOOT_PROGRESS(arg)
#endif
+#ifdef __PPC__
+# define EIEIO __asm__ volatile ("eieio")
+#else
+# define EIEIO /* nothing */
+#endif
#undef IDE_DEBUG
static int ide_bus_ok[CFG_IDE_MAXBUS] = {0,};
#endif
-static block_dev_desc_t ide_dev_desc[CFG_IDE_MAXDEVICE];
+block_dev_desc_t ide_dev_desc[CFG_IDE_MAXDEVICE];
/* ------------------------------------------------------------------------- */
#ifdef CONFIG_IDE_LED
-#if !defined(CONFIG_KUP4K) && !defined(CONFIG_KUP4X) &&!defined(CONFIG_BMS2003)
+#if !defined(CONFIG_KUP4K) && !defined(CONFIG_KUP4X) &&!defined(CONFIG_BMS2003) &&!defined(CONFIG_CPC45)
static void ide_led (uchar led, uchar status);
#else
extern void ide_led (uchar led, uchar status);
/* ------------------------------------------------------------------------- */
-#ifdef __PPC__
+#if defined(__PPC__) || defined(CONFIG_PXA_PCMCIA)
static void __inline__
ide_outb(int dev, int port, unsigned char val)
{
- PRINTF ("ide_outb (dev= %d, port= %d, val= 0x%02x) : @ 0x%08lx\n",
+ PRINTF ("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 */
- __asm__ volatile("eieio");
+ EIEIO;
*((uchar *)(ATA_CURR_BASE(dev)+port)) = val;
}
#else /* ! __PPC__ */
#endif /* __PPC__ */
-#ifdef __PPC__
+#if defined(__PPC__) || defined(CONFIG_PXA_PCMCIA)
static unsigned char __inline__
ide_inb(int dev, int port)
{
uchar val;
/* Ensure I/O operations complete */
- __asm__ volatile("eieio");
+ EIEIO;
val = *((uchar *)(ATA_CURR_BASE(dev)+port));
- PRINTF ("ide_inb (dev= %d, port= %d) : @ 0x%08lx -> 0x%02x\n",
+ PRINTF ("ide_inb (dev= %d, port= 0x%x) : @ 0x%08lx -> 0x%02x\n",
dev, port, (ATA_CURR_BASE(dev)+port), val);
return (val);
}
pbuf = (ushort *)(ATA_CURR_BASE(dev)+ATA_DATA_REG);
dbuf = (ushort *)sect_buf;
while (words--) {
- __asm__ volatile ("eieio");
+ EIEIO;
*pbuf = *dbuf++;
- __asm__ volatile ("eieio");
+ EIEIO;
}
if (words&1)
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);
#endif /* __LITTLE_ENDIAN || CONFIG_AU1X00 */
-#ifdef __PPC__
+#if defined(__PPC__) || defined(CONFIG_PXA_PCMCIA)
static void
output_data(int dev, ulong *sect_buf, int words)
{
pbuf = (ushort *)(ATA_CURR_BASE(dev)+ATA_DATA_REG);
dbuf = (ushort *)sect_buf;
while (words--) {
- __asm__ volatile ("eieio");
+ EIEIO;
*pbuf = *dbuf++;
- __asm__ volatile ("eieio");
+ EIEIO;
*pbuf = *dbuf++;
}
#else /* CONFIG_HMI10 */
pbuf_odd = (uchar *)(ATA_CURR_BASE(dev)+ATA_DATA_ODD);
dbuf = (uchar *)sect_buf;
while (words--) {
- __asm__ volatile ("eieio");
+ EIEIO;
*pbuf_even = *dbuf++;
- __asm__ volatile ("eieio");
+ EIEIO;
*pbuf_odd = *dbuf++;
- __asm__ volatile ("eieio");
+ EIEIO;
*pbuf_even = *dbuf++;
- __asm__ volatile ("eieio");
+ EIEIO;
*pbuf_odd = *dbuf++;
}
#endif /* CONFIG_HMI10 */
}
#endif /* __PPC__ */
-#ifdef __PPC__
+#if defined(__PPC__) || defined(CONFIG_PXA_PCMCIA)
static void
input_data(int dev, ulong *sect_buf, int words)
{
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--) {
- __asm__ volatile ("eieio");
+ EIEIO;
*dbuf++ = *pbuf;
- __asm__ volatile ("eieio");
+ EIEIO;
*dbuf++ = *pbuf;
}
#else /* CONFIG_HMI10 */
pbuf_odd = (uchar *)(ATA_CURR_BASE(dev)+ATA_DATA_ODD);
dbuf = (uchar *)sect_buf;
while (words--) {
- __asm__ volatile ("eieio");
+ EIEIO;
*dbuf++ = *pbuf_even;
- __asm__ volatile ("eieio");
+ EIEIO;
*dbuf++ = *pbuf_odd;
- __asm__ volatile ("eieio");
+ EIEIO;
*dbuf++ = *pbuf_even;
- __asm__ volatile ("eieio");
+ EIEIO;
*dbuf++ = *pbuf_odd;
}
#endif /* CONFIG_HMI10 */
pbuf = (ushort *)(ATA_CURR_BASE(dev)+ATA_DATA_REG);
dbuf = (ushort *)sect_buf;
while (words--) {
- __asm__ volatile ("eieio");
+ EIEIO;
*dbuf++ = *pbuf;
- __asm__ volatile ("eieio");
+ EIEIO;
}
if (words&1) {
#ifdef CONFIG_AMIGAONEG3SE
int max_bus_scan;
- int retries = 0;
char *s;
+#endif
+#ifdef CONFIG_ATAPI
+ int retries = 0;
int do_retry = 0;
#endif
dev_desc->if_type=IF_TYPE_IDE;
#ifdef CONFIG_ATAPI
-#ifdef CONFIG_AMIGAONEG3SE
do_retry = 0;
retries = 0;
/* Warning: This will be tricky to read */
while (retries <= 1) {
-#endif /* CONFIG_AMIGAONEG3SE */
-
/* check signature */
if ((ide_inb(device,ATA_SECT_CNT) == 0x01) &&
(ide_inb(device,ATA_SECT_NUM) == 0x01) &&
if (((c & ATA_STAT_DRQ) == 0) ||
((c & (ATA_STAT_FAULT|ATA_STAT_ERR)) != 0) ) {
+#ifdef CONFIG_ATAPI
#ifdef CONFIG_AMIGAONEG3SE
- if (retries == 0) {
- do_retry = 1;
- } else {
- return;
- }
-#else
- return;
-#endif /* CONFIG_AMIGAONEG3SE */
- }
-
-#ifdef CONFIG_AMIGAONEG3SE
- s = getenv("ide_doreset");
- if (s && strcmp(s, "on") == 0 && 1 == do_retry) {
- /* Need to soft reset the device in case it's an ATAPI... */
- PRINTF("Retrying...\n");
+ 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 */
+ }
+ /* Select device
+ */
ide_outb (device, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(device));
- udelay(100000);
- ide_outb (device, ATA_COMMAND, 0x08);
- udelay (100000); /* 100 ms */
retries++;
- } else {
- retries = 100;
+#else
+ return;
+#endif
}
+#ifdef CONFIG_ATAPI
+ else
+ break;
} /* see above - ugly to read */
-#endif /* CONFIG_AMIGAONEG3SE */
+
+ if (retries == 2) /* Not found */
+ return;
+#endif
input_swap_data (device, iobuf, ATA_SECTORWORDS);
#ifdef CONFIG_LBA48
if (iop->command_set_2 & 0x0400) { /* LBA 48 support */
- dev_desc->lba48support = 1;
- dev_desc->lba48 = (unsigned long long)iop->lba48_capacity[0] |
+ dev_desc->lba48 = 1;
+ dev_desc->lba = (unsigned long long)iop->lba48_capacity[0] |
((unsigned long long)iop->lba48_capacity[1] << 16) |
((unsigned long long)iop->lba48_capacity[2] << 32) |
((unsigned long long)iop->lba48_capacity[3] << 48);
} else {
- dev_desc->lba48support = 0;
dev_desc->lba48 = 0;
}
#endif /* CONFIG_LBA48 */
/* ------------------------------------------------------------------------- */
-#if defined(CONFIG_IDE_LED) && \
- !defined(CONFIG_AMIGAONEG3SE) && \
- !defined(CONFIG_KUP4K) && \
- !defined(CONFIG_KUP4X) && \
- !defined(CONFIG_HMI10)
+#if defined(CONFIG_IDE_LED) && \
+ !defined(CONFIG_AMIGAONEG3SE)&& \
+ !defined(CONFIG_CPC45) && \
+ !defined(CONFIG_HMI10) && \
+ !defined(CONFIG_KUP4K) && \
+ !defined(CONFIG_KUP4X)
static uchar led_buffer = 0; /* Buffer for current LED status */
* ATAPI Support
*/
-
#undef ATAPI_DEBUG
#ifdef ATAPI_DEBUG
#define AT_PRINTF(fmt,args...)
#endif
-#ifdef __PPC__
+#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
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--) {
- __asm__ volatile ("eieio");
+ EIEIO;
*pbuf = *dbuf++;
}
#else /* CONFIG_HMI10 */
pbuf_even = (uchar *)(ATA_CURR_BASE(dev)+ATA_DATA_EVEN);
pbuf_odd = (uchar *)(ATA_CURR_BASE(dev)+ATA_DATA_ODD);
while (shorts--) {
- __asm__ volatile ("eieio");
+ EIEIO;
*pbuf_even = *dbuf++;
- __asm__ volatile ("eieio");
+ EIEIO;
*pbuf_odd = *dbuf++;
}
#endif /* CONFIG_HMI10 */
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);
+
while (shorts--) {
- __asm__ volatile ("eieio");
+ EIEIO;
*dbuf++ = *pbuf;
}
#else /* CONFIG_HMI10 */
pbuf_even = (uchar *)(ATA_CURR_BASE(dev)+ATA_DATA_EVEN);
pbuf_odd = (uchar *)(ATA_CURR_BASE(dev)+ATA_DATA_ODD);
while (shorts--) {
- __asm__ volatile ("eieio");
+ EIEIO;
*dbuf++ = *pbuf_even;
- __asm__ volatile ("eieio");
+ EIEIO;
*dbuf++ = *pbuf_odd;
}
#endif /* CONFIG_HMI10 */
outsw(ATA_CURR_BASE(dev)+ATA_DATA_REG, sect_buf, shorts);
}
-
static void
input_data_shorts(int dev, ushort *sect_buf, int shorts)
{