Fix warning differ in signedness in common/cmd_ide.c
[platform/kernel/u-boot.git] / common / cmd_ide.c
1 /*
2  * (C) Copyright 2000-2005
3  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
4  *
5  * See file CREDITS for list of people who contributed to this
6  * project.
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License as
10  * published by the Free Software Foundation; either version 2 of
11  * the License, or (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
21  * MA 02111-1307 USA
22  *
23  */
24
25 /*
26  * IDE support
27  */
28 #include <common.h>
29 #include <config.h>
30 #include <watchdog.h>
31 #include <command.h>
32 #include <image.h>
33 #include <asm/byteorder.h>
34 #include <asm/io.h>
35
36 #if defined(CONFIG_IDE_8xx_DIRECT) || defined(CONFIG_IDE_PCMCIA)
37 # include <pcmcia.h>
38 #endif
39
40 #ifdef CONFIG_8xx
41 # include <mpc8xx.h>
42 #endif
43
44 #ifdef CONFIG_MPC5xxx
45 #include <mpc5xxx.h>
46 #endif
47
48 #include <ide.h>
49 #include <ata.h>
50
51 #ifdef CONFIG_STATUS_LED
52 # include <status_led.h>
53 #endif
54
55 #ifndef __PPC__
56 #include <asm/io.h>
57 #ifdef __MIPS__
58 /* Macros depend on this variable */
59 unsigned long mips_io_port_base = 0;
60 #endif
61 #endif
62
63 #ifdef CONFIG_IDE_8xx_DIRECT
64 DECLARE_GLOBAL_DATA_PTR;
65 #endif
66
67 #ifdef __PPC__
68 # define EIEIO          __asm__ volatile ("eieio")
69 # define SYNC           __asm__ volatile ("sync")
70 #else
71 # define EIEIO          /* nothing */
72 # define SYNC           /* nothing */
73 #endif
74
75 #if defined(CONFIG_CMD_IDE)
76
77 #ifdef CONFIG_IDE_8xx_DIRECT
78 /* Timings for IDE Interface
79  *
80  * SETUP / LENGTH / HOLD - cycles valid for 50 MHz clk
81  * 70      165      30     PIO-Mode 0, [ns]
82  *  4        9       2                 [Cycles]
83  * 50      125      20     PIO-Mode 1, [ns]
84  *  3        7       2                 [Cycles]
85  * 30      100      15     PIO-Mode 2, [ns]
86  *  2        6       1                 [Cycles]
87  * 30       80      10     PIO-Mode 3, [ns]
88  *  2        5       1                 [Cycles]
89  * 25       70      10     PIO-Mode 4, [ns]
90  *  2        4       1                 [Cycles]
91  */
92
93 const static pio_config_t pio_config_ns [IDE_MAX_PIO_MODE+1] =
94 {
95     /*  Setup  Length  Hold  */
96         { 70,   165,    30 },           /* PIO-Mode 0, [ns]     */
97         { 50,   125,    20 },           /* PIO-Mode 1, [ns]     */
98         { 30,   101,    15 },           /* PIO-Mode 2, [ns]     */
99         { 30,    80,    10 },           /* PIO-Mode 3, [ns]     */
100         { 25,    70,    10 },           /* PIO-Mode 4, [ns]     */
101 };
102
103 static pio_config_t pio_config_clk [IDE_MAX_PIO_MODE+1];
104
105 #ifndef CFG_PIO_MODE
106 #define CFG_PIO_MODE    0               /* use a relaxed default */
107 #endif
108 static int pio_mode = CFG_PIO_MODE;
109
110 /* Make clock cycles and always round up */
111
112 #define PCMCIA_MK_CLKS( t, T ) (( (t) * (T) + 999U ) / 1000U )
113
114 #endif /* CONFIG_IDE_8xx_DIRECT */
115
116 /* ------------------------------------------------------------------------- */
117
118 /* Current I/O Device   */
119 static int curr_device = -1;
120
121 /* Current offset for IDE0 / IDE1 bus access    */
122 ulong ide_bus_offset[CFG_IDE_MAXBUS] = {
123 #if defined(CFG_ATA_IDE0_OFFSET)
124         CFG_ATA_IDE0_OFFSET,
125 #endif
126 #if defined(CFG_ATA_IDE1_OFFSET) && (CFG_IDE_MAXBUS > 1)
127         CFG_ATA_IDE1_OFFSET,
128 #endif
129 };
130
131
132 #ifndef CONFIG_AMIGAONEG3SE
133 static int ide_bus_ok[CFG_IDE_MAXBUS];
134 #else
135 static int ide_bus_ok[CFG_IDE_MAXBUS] = {0,};
136 #endif
137
138 block_dev_desc_t ide_dev_desc[CFG_IDE_MAXDEVICE];
139 /* ------------------------------------------------------------------------- */
140
141 #ifdef CONFIG_IDE_LED
142 #if !defined(CONFIG_KUP4K) &&  !defined(CONFIG_KUP4X) &&!defined(CONFIG_BMS2003) &&!defined(CONFIG_CPC45)
143 static void  ide_led   (uchar led, uchar status);
144 #else
145 extern void  ide_led   (uchar led, uchar status);
146 #endif
147 #else
148 #ifndef CONFIG_AMIGAONEG3SE
149 #define ide_led(a,b)    /* dummy */
150 #else
151 extern void ide_led(uchar led, uchar status);
152 #define LED_IDE1  1
153 #define LED_IDE2  2
154 #define CONFIG_IDE_LED 1
155 #define DEVICE_LED(x) 1
156 #endif
157 #endif
158
159 #ifdef CONFIG_IDE_RESET
160 static void  ide_reset (void);
161 #else
162 #define ide_reset()     /* dummy */
163 #endif
164
165 static void  ide_ident (block_dev_desc_t *dev_desc);
166 static uchar ide_wait  (int dev, ulong t);
167
168 #define IDE_TIME_OUT    2000    /* 2 sec timeout */
169
170 #define ATAPI_TIME_OUT  7000    /* 7 sec timeout (5 sec seems to work...) */
171
172 #define IDE_SPIN_UP_TIME_OUT 5000 /* 5 sec spin-up timeout */
173
174 void inline ide_outb(int dev, int port, unsigned char val);
175 unsigned char inline ide_inb(int dev, int port);
176 static void input_data(int dev, ulong *sect_buf, int words);
177 static void output_data(int dev, ulong *sect_buf, int words);
178 static void ident_cpy (unsigned char *dest, unsigned char *src, unsigned int len);
179
180 #ifndef CFG_ATA_PORT_ADDR
181 #define CFG_ATA_PORT_ADDR(port) (port)
182 #endif
183
184 #ifdef CONFIG_ATAPI
185 static void     atapi_inquiry(block_dev_desc_t *dev_desc);
186 ulong atapi_read (int device, lbaint_t blknr, ulong blkcnt, void *buffer);
187 #endif
188
189
190 #ifdef CONFIG_IDE_8xx_DIRECT
191 static void set_pcmcia_timing (int pmode);
192 #endif
193
194 /* ------------------------------------------------------------------------- */
195
196 int do_ide (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
197 {
198     int rcode = 0;
199
200     switch (argc) {
201     case 0:
202     case 1:
203         printf ("Usage:\n%s\n", cmdtp->usage);
204         return 1;
205     case 2:
206         if (strncmp(argv[1],"res",3) == 0) {
207                 puts ("\nReset IDE"
208 #ifdef CONFIG_IDE_8xx_DIRECT
209                         " on PCMCIA " PCMCIA_SLOT_MSG
210 #endif
211                         ": ");
212
213                 ide_init ();
214                 return 0;
215         } else if (strncmp(argv[1],"inf",3) == 0) {
216                 int i;
217
218                 putc ('\n');
219
220                 for (i=0; i<CFG_IDE_MAXDEVICE; ++i) {
221                         if (ide_dev_desc[i].type==DEV_TYPE_UNKNOWN)
222                                 continue; /* list only known devices */
223                         printf ("IDE device %d: ", i);
224                         dev_print(&ide_dev_desc[i]);
225                 }
226                 return 0;
227
228         } else if (strncmp(argv[1],"dev",3) == 0) {
229                 if ((curr_device < 0) || (curr_device >= CFG_IDE_MAXDEVICE)) {
230                         puts ("\nno IDE devices available\n");
231                         return 1;
232                 }
233                 printf ("\nIDE device %d: ", curr_device);
234                 dev_print(&ide_dev_desc[curr_device]);
235                 return 0;
236         } else if (strncmp(argv[1],"part",4) == 0) {
237                 int dev, ok;
238
239                 for (ok=0, dev=0; dev<CFG_IDE_MAXDEVICE; ++dev) {
240                         if (ide_dev_desc[dev].part_type!=PART_TYPE_UNKNOWN) {
241                                 ++ok;
242                                 if (dev)
243                                         putc ('\n');
244                                 print_part(&ide_dev_desc[dev]);
245                         }
246                 }
247                 if (!ok) {
248                         puts ("\nno IDE devices available\n");
249                         rcode ++;
250                 }
251                 return rcode;
252         }
253         printf ("Usage:\n%s\n", cmdtp->usage);
254         return 1;
255     case 3:
256         if (strncmp(argv[1],"dev",3) == 0) {
257                 int dev = (int)simple_strtoul(argv[2], NULL, 10);
258
259                 printf ("\nIDE device %d: ", dev);
260                 if (dev >= CFG_IDE_MAXDEVICE) {
261                         puts ("unknown device\n");
262                         return 1;
263                 }
264                 dev_print(&ide_dev_desc[dev]);
265                 /*ide_print (dev);*/
266
267                 if (ide_dev_desc[dev].type == DEV_TYPE_UNKNOWN) {
268                         return 1;
269                 }
270
271                 curr_device = dev;
272
273                 puts ("... is now current device\n");
274
275                 return 0;
276         } else if (strncmp(argv[1],"part",4) == 0) {
277                 int dev = (int)simple_strtoul(argv[2], NULL, 10);
278
279                 if (ide_dev_desc[dev].part_type!=PART_TYPE_UNKNOWN) {
280                                 print_part(&ide_dev_desc[dev]);
281                 } else {
282                         printf ("\nIDE device %d not available\n", dev);
283                         rcode = 1;
284                 }
285                 return rcode;
286 #if 0
287         } else if (strncmp(argv[1],"pio",4) == 0) {
288                 int mode = (int)simple_strtoul(argv[2], NULL, 10);
289
290                 if ((mode >= 0) && (mode <= IDE_MAX_PIO_MODE)) {
291                         puts ("\nSetting ");
292                         pio_mode = mode;
293                         ide_init ();
294                 } else {
295                         printf ("\nInvalid PIO mode %d (0 ... %d only)\n",
296                                 mode, IDE_MAX_PIO_MODE);
297                 }
298                 return;
299 #endif
300         }
301
302         printf ("Usage:\n%s\n", cmdtp->usage);
303         return 1;
304     default:
305         /* at least 4 args */
306
307         if (strcmp(argv[1],"read") == 0) {
308                 ulong addr = simple_strtoul(argv[2], NULL, 16);
309                 ulong cnt  = simple_strtoul(argv[4], NULL, 16);
310                 ulong n;
311 #ifdef CFG_64BIT_STRTOUL
312                 lbaint_t blk  = simple_strtoull(argv[3], NULL, 16);
313
314                 printf ("\nIDE read: device %d block # %qd, count %ld ... ",
315                         curr_device, blk, cnt);
316 #else
317                 lbaint_t blk  = simple_strtoul(argv[3], NULL, 16);
318
319                 printf ("\nIDE read: device %d block # %ld, count %ld ... ",
320                         curr_device, blk, cnt);
321 #endif
322
323                 n = ide_dev_desc[curr_device].block_read (curr_device,
324                                                           blk, cnt,
325                                                           (ulong *)addr);
326                 /* flush cache after read */
327                 flush_cache (addr, cnt*ide_dev_desc[curr_device].blksz);
328
329                 printf ("%ld blocks read: %s\n",
330                         n, (n==cnt) ? "OK" : "ERROR");
331                 if (n==cnt) {
332                         return 0;
333                 } else {
334                         return 1;
335                 }
336         } else if (strcmp(argv[1],"write") == 0) {
337                 ulong addr = simple_strtoul(argv[2], NULL, 16);
338                 ulong cnt  = simple_strtoul(argv[4], NULL, 16);
339                 ulong n;
340 #ifdef CFG_64BIT_STRTOUL
341                 lbaint_t blk  = simple_strtoull(argv[3], NULL, 16);
342
343                 printf ("\nIDE write: device %d block # %qd, count %ld ... ",
344                         curr_device, blk, cnt);
345 #else
346                 lbaint_t blk  = simple_strtoul(argv[3], NULL, 16);
347
348                 printf ("\nIDE write: device %d block # %ld, count %ld ... ",
349                         curr_device, blk, cnt);
350 #endif
351
352                 n = ide_write (curr_device, blk, cnt, (ulong *)addr);
353
354                 printf ("%ld blocks written: %s\n",
355                         n, (n==cnt) ? "OK" : "ERROR");
356                 if (n==cnt) {
357                         return 0;
358                 } else {
359                         return 1;
360                 }
361         } else {
362                 printf ("Usage:\n%s\n", cmdtp->usage);
363                 rcode = 1;
364         }
365
366         return rcode;
367     }
368 }
369
370 int do_diskboot (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
371 {
372         char *boot_device = NULL;
373         char *ep;
374         int dev, part = 0;
375         ulong addr, cnt, checksum;
376         disk_partition_t info;
377         image_header_t *hdr;
378         int rcode = 0;
379
380         show_boot_progress (41);
381         switch (argc) {
382         case 1:
383                 addr = CFG_LOAD_ADDR;
384                 boot_device = getenv ("bootdevice");
385                 break;
386         case 2:
387                 addr = simple_strtoul(argv[1], NULL, 16);
388                 boot_device = getenv ("bootdevice");
389                 break;
390         case 3:
391                 addr = simple_strtoul(argv[1], NULL, 16);
392                 boot_device = argv[2];
393                 break;
394         default:
395                 printf ("Usage:\n%s\n", cmdtp->usage);
396                 show_boot_progress (-42);
397                 return 1;
398         }
399         show_boot_progress (42);
400
401         if (!boot_device) {
402                 puts ("\n** No boot device **\n");
403                 show_boot_progress (-43);
404                 return 1;
405         }
406         show_boot_progress (43);
407
408         dev = simple_strtoul(boot_device, &ep, 16);
409
410         if (ide_dev_desc[dev].type==DEV_TYPE_UNKNOWN) {
411                 printf ("\n** Device %d not available\n", dev);
412                 show_boot_progress (-44);
413                 return 1;
414         }
415         show_boot_progress (44);
416
417         if (*ep) {
418                 if (*ep != ':') {
419                         puts ("\n** Invalid boot device, use `dev[:part]' **\n");
420                         show_boot_progress (-45);
421                         return 1;
422                 }
423                 part = simple_strtoul(++ep, NULL, 16);
424         }
425         show_boot_progress (45);
426         if (get_partition_info (&ide_dev_desc[dev], part, &info)) {
427                 show_boot_progress (-46);
428                 return 1;
429         }
430         show_boot_progress (46);
431         if ((strncmp((char *)info.type, BOOT_PART_TYPE, sizeof(info.type)) != 0) &&
432             (strncmp((char *)info.type, BOOT_PART_COMP, sizeof(info.type)) != 0)) {
433                 printf ("\n** Invalid partition type \"%.32s\""
434                         " (expect \"" BOOT_PART_TYPE "\")\n",
435                         info.type);
436                 show_boot_progress (-47);
437                 return 1;
438         }
439         show_boot_progress (47);
440
441         printf ("\nLoading from IDE device %d, partition %d: "
442                 "Name: %.32s  Type: %.32s\n",
443                 dev, part, info.name, info.type);
444
445         debug ("First Block: %ld,  # of blocks: %ld, Block Size: %ld\n",
446                 info.start, info.size, info.blksz);
447
448         if (ide_dev_desc[dev].block_read (dev, info.start, 1, (ulong *)addr) != 1) {
449                 printf ("** Read error on %d:%d\n", dev, part);
450                 show_boot_progress (-48);
451                 return 1;
452         }
453         show_boot_progress (48);
454
455         hdr = (image_header_t *)addr;
456
457         if (ntohl(hdr->ih_magic) != IH_MAGIC) {
458                 printf("\n** Bad Magic Number **\n");
459                 show_boot_progress (-49);
460                 return 1;
461         }
462         show_boot_progress (49);
463
464         checksum = ntohl(hdr->ih_hcrc);
465         hdr->ih_hcrc = 0;
466
467         if (crc32 (0, (uchar *)hdr, sizeof(image_header_t)) != checksum) {
468                 puts ("\n** Bad Header Checksum **\n");
469                 show_boot_progress (-50);
470                 return 1;
471         }
472         show_boot_progress (50);
473         hdr->ih_hcrc = htonl(checksum); /* restore checksum for later use */
474
475         print_image_hdr (hdr);
476
477         cnt = (ntohl(hdr->ih_size) + sizeof(image_header_t));
478         cnt += info.blksz - 1;
479         cnt /= info.blksz;
480         cnt -= 1;
481
482         if (ide_dev_desc[dev].block_read (dev, info.start+1, cnt,
483                       (ulong *)(addr+info.blksz)) != cnt) {
484                 printf ("** Read error on %d:%d\n", dev, part);
485                 show_boot_progress (-51);
486                 return 1;
487         }
488         show_boot_progress (51);
489
490
491         /* Loading ok, update default load address */
492
493         load_addr = addr;
494
495         /* Check if we should attempt an auto-start */
496         if (((ep = getenv("autostart")) != NULL) && (strcmp(ep,"yes") == 0)) {
497                 char *local_args[2];
498                 extern int do_bootm (cmd_tbl_t *, int, int, char *[]);
499
500                 local_args[0] = argv[0];
501                 local_args[1] = NULL;
502
503                 printf ("Automatic boot of image at addr 0x%08lX ...\n", addr);
504
505                 do_bootm (cmdtp, 0, 1, local_args);
506                 rcode = 1;
507         }
508         return rcode;
509 }
510
511 /* ------------------------------------------------------------------------- */
512
513 void ide_init (void)
514 {
515
516 #ifdef CONFIG_IDE_8xx_DIRECT
517         volatile immap_t *immr = (immap_t *)CFG_IMMR;
518         volatile pcmconf8xx_t *pcmp = &(immr->im_pcmcia);
519 #endif
520         unsigned char c;
521         int i, bus;
522 #if defined(CONFIG_AMIGAONEG3SE) || defined(CONFIG_SC3)
523         unsigned int ata_reset_time = ATA_RESET_TIME;
524         char *s;
525 #endif
526 #ifdef CONFIG_AMIGAONEG3SE
527         unsigned int max_bus_scan;
528 #endif
529 #ifdef CONFIG_IDE_8xx_PCCARD
530         extern int pcmcia_on (void);
531         extern int ide_devices_found; /* Initialized in check_ide_device() */
532 #endif  /* CONFIG_IDE_8xx_PCCARD */
533
534 #ifdef CONFIG_IDE_PREINIT
535         extern int ide_preinit (void);
536         WATCHDOG_RESET();
537
538         if (ide_preinit ()) {
539                 puts ("ide_preinit failed\n");
540                 return;
541         }
542 #endif  /* CONFIG_IDE_PREINIT */
543
544 #ifdef CONFIG_IDE_8xx_PCCARD
545         extern int pcmcia_on (void);
546         extern int ide_devices_found; /* Initialized in check_ide_device() */
547
548         WATCHDOG_RESET();
549
550         ide_devices_found = 0;
551         /* initialize the PCMCIA IDE adapter card */
552         pcmcia_on();
553         if (!ide_devices_found)
554                 return;
555         udelay (1000000);       /* 1 s */
556 #endif  /* CONFIG_IDE_8xx_PCCARD */
557
558         WATCHDOG_RESET();
559
560 #ifdef CONFIG_IDE_8xx_DIRECT
561         /* Initialize PIO timing tables */
562         for (i=0; i <= IDE_MAX_PIO_MODE; ++i) {
563                 pio_config_clk[i].t_setup  = PCMCIA_MK_CLKS(pio_config_ns[i].t_setup,
564                                                                 gd->bus_clk);
565                 pio_config_clk[i].t_length = PCMCIA_MK_CLKS(pio_config_ns[i].t_length,
566                                                                 gd->bus_clk);
567                 pio_config_clk[i].t_hold   = PCMCIA_MK_CLKS(pio_config_ns[i].t_hold,
568                                                                 gd->bus_clk);
569                 debug ( "PIO Mode %d: setup=%2d ns/%d clk"
570                         "  len=%3d ns/%d clk"
571                         "  hold=%2d ns/%d clk\n",
572                         i,
573                         pio_config_ns[i].t_setup,  pio_config_clk[i].t_setup,
574                         pio_config_ns[i].t_length, pio_config_clk[i].t_length,
575                         pio_config_ns[i].t_hold,   pio_config_clk[i].t_hold);
576         }
577 #endif /* CONFIG_IDE_8xx_DIRECT */
578
579         /* Reset the IDE just to be sure.
580          * Light LED's to show
581          */
582         ide_led ((LED_IDE1 | LED_IDE2), 1);             /* LED's on     */
583         ide_reset (); /* ATAPI Drives seems to need a proper IDE Reset */
584
585 #ifdef CONFIG_IDE_8xx_DIRECT
586         /* PCMCIA / IDE initialization for common mem space */
587         pcmp->pcmc_pgcrb = 0;
588
589         /* start in PIO mode 0 - most relaxed timings */
590         pio_mode = 0;
591         set_pcmcia_timing (pio_mode);
592 #endif /* CONFIG_IDE_8xx_DIRECT */
593
594         /*
595          * Wait for IDE to get ready.
596          * According to spec, this can take up to 31 seconds!
597          */
598 #ifndef CONFIG_AMIGAONEG3SE
599         for (bus=0; bus<CFG_IDE_MAXBUS; ++bus) {
600                 int dev = bus * (CFG_IDE_MAXDEVICE / CFG_IDE_MAXBUS);
601 #else
602         s = getenv("ide_maxbus");
603         if (s)
604                 max_bus_scan = simple_strtol(s, NULL, 10);
605         else
606                 max_bus_scan = CFG_IDE_MAXBUS;
607
608         for (bus=0; bus<max_bus_scan; ++bus) {
609                 int dev = bus * (CFG_IDE_MAXDEVICE / max_bus_scan);
610 #endif
611
612 #ifdef CONFIG_IDE_8xx_PCCARD
613                 /* Skip non-ide devices from probing */
614                 if ((ide_devices_found & (1 << bus)) == 0) {
615                         ide_led ((LED_IDE1 | LED_IDE2), 0); /* LED's off */
616                         continue;
617                 }
618 #endif
619                 printf ("Bus %d: ", bus);
620
621                 ide_bus_ok[bus] = 0;
622
623                 /* Select device
624                  */
625                 udelay (100000);                /* 100 ms */
626                 ide_outb (dev, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(dev));
627                 udelay (100000);                /* 100 ms */
628 #if defined(CONFIG_AMIGAONEG3SE) || defined(CONFIG_SC3)
629                 if ((s = getenv("ide_reset_timeout")) != NULL)
630                         ata_reset_time = simple_strtol(s, NULL, 10);
631 #endif
632                 i = 0;
633                 do {
634                         udelay (10000);         /* 10 ms */
635
636                         c = ide_inb (dev, ATA_STATUS);
637                         i++;
638 #if defined(CONFIG_AMIGAONEG3SE) || defined(CONFIG_SC3)
639                         if (i > (ata_reset_time * 100)) {
640 #else
641                         if (i > (ATA_RESET_TIME * 100)) {
642 #endif
643                                 puts ("** Timeout **\n");
644                                 ide_led ((LED_IDE1 | LED_IDE2), 0); /* LED's off */
645 #ifdef CONFIG_AMIGAONEG3SE
646                                 /* If this is the second bus, the first one was OK */
647                                 if (bus != 0) {
648                                         ide_bus_ok[bus] = 0;
649                                         goto skip_bus;
650                                 }
651 #endif
652                                 return;
653                         }
654                         if ((i >= 100) && ((i%100)==0)) {
655                                 putc ('.');
656                         }
657                 } while (c & ATA_STAT_BUSY);
658
659                 if (c & (ATA_STAT_BUSY | ATA_STAT_FAULT)) {
660                         puts ("not available  ");
661                         debug ("Status = 0x%02X ", c);
662 #ifndef CONFIG_ATAPI /* ATAPI Devices do not set DRDY */
663                 } else  if ((c & ATA_STAT_READY) == 0) {
664                         puts ("not available  ");
665                         debug ("Status = 0x%02X ", c);
666 #endif
667                 } else {
668                         puts ("OK ");
669                         ide_bus_ok[bus] = 1;
670                 }
671                 WATCHDOG_RESET();
672         }
673
674 #ifdef CONFIG_AMIGAONEG3SE
675       skip_bus:
676 #endif
677         putc ('\n');
678
679         ide_led ((LED_IDE1 | LED_IDE2), 0);     /* LED's off    */
680
681         curr_device = -1;
682         for (i=0; i<CFG_IDE_MAXDEVICE; ++i) {
683 #ifdef CONFIG_IDE_LED
684                 int led = (IDE_BUS(i) == 0) ? LED_IDE1 : LED_IDE2;
685 #endif
686                 ide_dev_desc[i].type=DEV_TYPE_UNKNOWN;
687                 ide_dev_desc[i].if_type=IF_TYPE_IDE;
688                 ide_dev_desc[i].dev=i;
689                 ide_dev_desc[i].part_type=PART_TYPE_UNKNOWN;
690                 ide_dev_desc[i].blksz=0;
691                 ide_dev_desc[i].lba=0;
692                 ide_dev_desc[i].block_read=ide_read;
693                 if (!ide_bus_ok[IDE_BUS(i)])
694                         continue;
695                 ide_led (led, 1);               /* LED on       */
696                 ide_ident(&ide_dev_desc[i]);
697                 ide_led (led, 0);               /* LED off      */
698                 dev_print(&ide_dev_desc[i]);
699 /*              ide_print (i); */
700                 if ((ide_dev_desc[i].lba > 0) && (ide_dev_desc[i].blksz > 0)) {
701                         init_part (&ide_dev_desc[i]);                   /* initialize partition type */
702                         if (curr_device < 0)
703                                 curr_device = i;
704                 }
705         }
706         WATCHDOG_RESET();
707 }
708
709 /* ------------------------------------------------------------------------- */
710
711 block_dev_desc_t * ide_get_dev(int dev)
712 {
713         return (dev < CFG_IDE_MAXDEVICE) ? &ide_dev_desc[dev] : NULL;
714 }
715
716
717 #ifdef CONFIG_IDE_8xx_DIRECT
718
719 static void
720 set_pcmcia_timing (int pmode)
721 {
722         volatile immap_t *immr = (immap_t *)CFG_IMMR;
723         volatile pcmconf8xx_t *pcmp = &(immr->im_pcmcia);
724         ulong timings;
725
726         debug ("Set timing for PIO Mode %d\n", pmode);
727
728         timings = PCMCIA_SHT(pio_config_clk[pmode].t_hold)
729                 | PCMCIA_SST(pio_config_clk[pmode].t_setup)
730                 | PCMCIA_SL (pio_config_clk[pmode].t_length)
731                 ;
732
733         /* IDE 0
734          */
735         pcmp->pcmc_pbr0 = CFG_PCMCIA_PBR0;
736         pcmp->pcmc_por0 = CFG_PCMCIA_POR0
737 #if (CFG_PCMCIA_POR0 != 0)
738                         | timings
739 #endif
740                         ;
741         debug ("PBR0: %08x  POR0: %08x\n", pcmp->pcmc_pbr0, pcmp->pcmc_por0);
742
743         pcmp->pcmc_pbr1 = CFG_PCMCIA_PBR1;
744         pcmp->pcmc_por1 = CFG_PCMCIA_POR1
745 #if (CFG_PCMCIA_POR1 != 0)
746                         | timings
747 #endif
748                         ;
749         debug ("PBR1: %08x  POR1: %08x\n", pcmp->pcmc_pbr1, pcmp->pcmc_por1);
750
751         pcmp->pcmc_pbr2 = CFG_PCMCIA_PBR2;
752         pcmp->pcmc_por2 = CFG_PCMCIA_POR2
753 #if (CFG_PCMCIA_POR2 != 0)
754                         | timings
755 #endif
756                         ;
757         debug ("PBR2: %08x  POR2: %08x\n", pcmp->pcmc_pbr2, pcmp->pcmc_por2);
758
759         pcmp->pcmc_pbr3 = CFG_PCMCIA_PBR3;
760         pcmp->pcmc_por3 = CFG_PCMCIA_POR3
761 #if (CFG_PCMCIA_POR3 != 0)
762                         | timings
763 #endif
764                         ;
765         debug ("PBR3: %08x  POR3: %08x\n", pcmp->pcmc_pbr3, pcmp->pcmc_por3);
766
767         /* IDE 1
768          */
769         pcmp->pcmc_pbr4 = CFG_PCMCIA_PBR4;
770         pcmp->pcmc_por4 = CFG_PCMCIA_POR4
771 #if (CFG_PCMCIA_POR4 != 0)
772                         | timings
773 #endif
774                         ;
775         debug ("PBR4: %08x  POR4: %08x\n", pcmp->pcmc_pbr4, pcmp->pcmc_por4);
776
777         pcmp->pcmc_pbr5 = CFG_PCMCIA_PBR5;
778         pcmp->pcmc_por5 = CFG_PCMCIA_POR5
779 #if (CFG_PCMCIA_POR5 != 0)
780                         | timings
781 #endif
782                         ;
783         debug ("PBR5: %08x  POR5: %08x\n", pcmp->pcmc_pbr5, pcmp->pcmc_por5);
784
785         pcmp->pcmc_pbr6 = CFG_PCMCIA_PBR6;
786         pcmp->pcmc_por6 = CFG_PCMCIA_POR6
787 #if (CFG_PCMCIA_POR6 != 0)
788                         | timings
789 #endif
790                         ;
791         debug ("PBR6: %08x  POR6: %08x\n", pcmp->pcmc_pbr6, pcmp->pcmc_por6);
792
793         pcmp->pcmc_pbr7 = CFG_PCMCIA_PBR7;
794         pcmp->pcmc_por7 = CFG_PCMCIA_POR7
795 #if (CFG_PCMCIA_POR7 != 0)
796                         | timings
797 #endif
798                         ;
799         debug ("PBR7: %08x  POR7: %08x\n", pcmp->pcmc_pbr7, pcmp->pcmc_por7);
800
801 }
802
803 #endif  /* CONFIG_IDE_8xx_DIRECT */
804
805 /* ------------------------------------------------------------------------- */
806
807 void inline
808 __ide_outb(int dev, int port, unsigned char val)
809 {
810         debug ("ide_outb (dev= %d, port= 0x%x, val= 0x%02x) : @ 0x%08lx\n",
811                 dev, port, val, (ATA_CURR_BASE(dev)+CFG_ATA_PORT_ADDR(port)));
812         outb(val, (ATA_CURR_BASE(dev)+CFG_ATA_PORT_ADDR(port)));
813 }
814 void inline ide_outb (int dev, int port, unsigned char val)
815                 __attribute__((weak, alias("__ide_outb")));
816
817 unsigned char inline
818 __ide_inb(int dev, int port)
819 {
820         uchar val;
821         val = inb((ATA_CURR_BASE(dev)+CFG_ATA_PORT_ADDR(port)));
822         debug ("ide_inb (dev= %d, port= 0x%x) : @ 0x%08lx -> 0x%02x\n",
823                 dev, port, (ATA_CURR_BASE(dev)+CFG_ATA_PORT_ADDR(port)), val);
824         return val;
825 }
826 unsigned char inline ide_inb(int dev, int port)
827                         __attribute__((weak, alias("__ide_inb")));
828
829 #ifdef __PPC__
830 # ifdef CONFIG_AMIGAONEG3SE
831 static void
832 output_data_short(int dev, ulong *sect_buf, int words)
833 {
834         ushort  *dbuf;
835         volatile ushort *pbuf;
836
837         pbuf = (ushort *)(ATA_CURR_BASE(dev)+ATA_DATA_REG);
838         dbuf = (ushort *)sect_buf;
839         while (words--) {
840                 EIEIO;
841                 *pbuf = *dbuf++;
842                 EIEIO;
843         }
844
845         if (words&1)
846                 *pbuf = 0;
847 }
848 # endif /* CONFIG_AMIGAONEG3SE */
849 #endif /* __PPC_ */
850
851 /* We only need to swap data if we are running on a big endian cpu. */
852 /* But Au1x00 cpu:s already swaps data in big endian mode! */
853 #if defined(__LITTLE_ENDIAN) || ( defined(CONFIG_AU1X00) && !defined(CONFIG_GTH2) )
854 #define input_swap_data(x,y,z) input_data(x,y,z)
855 #else
856 static void
857 input_swap_data(int dev, ulong *sect_buf, int words)
858 {
859 #if defined(CONFIG_HMI10) || defined(CONFIG_CPC45)
860         uchar i;
861         volatile uchar *pbuf_even = (uchar *)(ATA_CURR_BASE(dev)+ATA_DATA_EVEN);
862         volatile uchar *pbuf_odd  = (uchar *)(ATA_CURR_BASE(dev)+ATA_DATA_ODD);
863         ushort  *dbuf = (ushort *)sect_buf;
864
865         while (words--) {
866                 for (i=0; i<2; i++) {
867                         *(((uchar *)(dbuf)) + 1) = *pbuf_even;
868                         *(uchar *)dbuf = *pbuf_odd;
869                         dbuf+=1;
870                 }
871         }
872 #else
873         volatile ushort *pbuf = (ushort *)(ATA_CURR_BASE(dev)+ATA_DATA_REG);
874         ushort  *dbuf = (ushort *)sect_buf;
875
876         debug("in input swap data base for read is %lx\n", (unsigned long) pbuf);
877
878         while (words--) {
879 #ifdef __MIPS__
880                 *dbuf++ = swab16p((u16*)pbuf);
881                 *dbuf++ = swab16p((u16*)pbuf);
882 #elif defined(CONFIG_PCS440EP)
883                 *dbuf++ = *pbuf;
884                 *dbuf++ = *pbuf;
885 #else
886                 *dbuf++ = ld_le16(pbuf);
887                 *dbuf++ = ld_le16(pbuf);
888 #endif /* !MIPS */
889         }
890 #endif
891 }
892 #endif  /* __LITTLE_ENDIAN || CONFIG_AU1X00 */
893
894
895 #if defined(__PPC__) || defined(CONFIG_PXA_PCMCIA)
896 static void
897 output_data(int dev, ulong *sect_buf, int words)
898 {
899 #if defined(CONFIG_HMI10) || defined(CONFIG_CPC45)
900         uchar   *dbuf;
901         volatile uchar  *pbuf_even;
902         volatile uchar  *pbuf_odd;
903
904         pbuf_even = (uchar *)(ATA_CURR_BASE(dev)+ATA_DATA_EVEN);
905         pbuf_odd  = (uchar *)(ATA_CURR_BASE(dev)+ATA_DATA_ODD);
906         dbuf = (uchar *)sect_buf;
907         while (words--) {
908                 EIEIO;
909                 *pbuf_even = *dbuf++;
910                 EIEIO;
911                 *pbuf_odd = *dbuf++;
912                 EIEIO;
913                 *pbuf_even = *dbuf++;
914                 EIEIO;
915                 *pbuf_odd = *dbuf++;
916         }
917 #else
918         ushort  *dbuf;
919         volatile ushort *pbuf;
920
921         pbuf = (ushort *)(ATA_CURR_BASE(dev)+ATA_DATA_REG);
922         dbuf = (ushort *)sect_buf;
923         while (words--) {
924 #if defined(CONFIG_PCS440EP)
925                 /* not tested, because CF was write protected */
926                 EIEIO;
927                 *pbuf = ld_le16(dbuf++);
928                 EIEIO;
929                 *pbuf = ld_le16(dbuf++);
930 #else
931                 EIEIO;
932                 *pbuf = *dbuf++;
933                 EIEIO;
934                 *pbuf = *dbuf++;
935 #endif
936         }
937 #endif
938 }
939 #else   /* ! __PPC__ */
940 static void
941 output_data(int dev, ulong *sect_buf, int words)
942 {
943         outsw(ATA_CURR_BASE(dev)+ATA_DATA_REG, sect_buf, words<<1);
944 }
945 #endif  /* __PPC__ */
946
947 #if defined(__PPC__) || defined(CONFIG_PXA_PCMCIA)
948 static void
949 input_data(int dev, ulong *sect_buf, int words)
950 {
951 #if defined(CONFIG_HMI10) || defined(CONFIG_CPC45)
952         uchar   *dbuf;
953         volatile uchar  *pbuf_even;
954         volatile uchar  *pbuf_odd;
955
956         pbuf_even = (uchar *)(ATA_CURR_BASE(dev)+ATA_DATA_EVEN);
957         pbuf_odd  = (uchar *)(ATA_CURR_BASE(dev)+ATA_DATA_ODD);
958         dbuf = (uchar *)sect_buf;
959         while (words--) {
960                 *dbuf++ = *pbuf_even;
961                 EIEIO;
962                 SYNC;
963                 *dbuf++ = *pbuf_odd;
964                 EIEIO;
965                 SYNC;
966                 *dbuf++ = *pbuf_even;
967                 EIEIO;
968                 SYNC;
969                 *dbuf++ = *pbuf_odd;
970                 EIEIO;
971                 SYNC;
972         }
973 #else
974         ushort  *dbuf;
975         volatile ushort *pbuf;
976
977         pbuf = (ushort *)(ATA_CURR_BASE(dev)+ATA_DATA_REG);
978         dbuf = (ushort *)sect_buf;
979
980         debug("in input data base for read is %lx\n", (unsigned long) pbuf);
981
982         while (words--) {
983 #if defined(CONFIG_PCS440EP)
984                 EIEIO;
985                 *dbuf++ = ld_le16(pbuf);
986                 EIEIO;
987                 *dbuf++ = ld_le16(pbuf);
988 #else
989                 EIEIO;
990                 *dbuf++ = *pbuf;
991                 EIEIO;
992                 *dbuf++ = *pbuf;
993 #endif
994         }
995 #endif
996 }
997 #else   /* ! __PPC__ */
998 static void
999 input_data(int dev, ulong *sect_buf, int words)
1000 {
1001         insw(ATA_CURR_BASE(dev)+ATA_DATA_REG, sect_buf, words << 1);
1002 }
1003
1004 #endif  /* __PPC__ */
1005
1006 #ifdef CONFIG_AMIGAONEG3SE
1007 static void
1008 input_data_short(int dev, ulong *sect_buf, int words)
1009 {
1010         ushort  *dbuf;
1011         volatile ushort *pbuf;
1012
1013         pbuf = (ushort *)(ATA_CURR_BASE(dev)+ATA_DATA_REG);
1014         dbuf = (ushort *)sect_buf;
1015         while (words--) {
1016                 EIEIO;
1017                 *dbuf++ = *pbuf;
1018                 EIEIO;
1019         }
1020
1021         if (words&1) {
1022                 ushort dummy;
1023                 dummy = *pbuf;
1024         }
1025 }
1026 #endif
1027
1028 /* -------------------------------------------------------------------------
1029  */
1030 static void ide_ident (block_dev_desc_t *dev_desc)
1031 {
1032         ulong iobuf[ATA_SECTORWORDS];
1033         unsigned char c;
1034         hd_driveid_t *iop = (hd_driveid_t *)iobuf;
1035
1036 #ifdef CONFIG_AMIGAONEG3SE
1037         int max_bus_scan;
1038         char *s;
1039 #endif
1040 #ifdef CONFIG_ATAPI
1041         int retries = 0;
1042         int do_retry = 0;
1043 #endif
1044
1045 #if 0
1046         int mode, cycle_time;
1047 #endif
1048         int device;
1049         device=dev_desc->dev;
1050         printf ("  Device %d: ", device);
1051
1052 #ifdef CONFIG_AMIGAONEG3SE
1053         s = getenv("ide_maxbus");
1054         if (s) {
1055                 max_bus_scan = simple_strtol(s, NULL, 10);
1056         } else {
1057                 max_bus_scan = CFG_IDE_MAXBUS;
1058         }
1059         if (device >= max_bus_scan*2) {
1060                 dev_desc->type=DEV_TYPE_UNKNOWN;
1061                 return;
1062         }
1063 #endif
1064
1065         ide_led (DEVICE_LED(device), 1);        /* LED on       */
1066         /* Select device
1067          */
1068         ide_outb (device, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(device));
1069         dev_desc->if_type=IF_TYPE_IDE;
1070 #ifdef CONFIG_ATAPI
1071
1072     do_retry = 0;
1073     retries = 0;
1074
1075     /* Warning: This will be tricky to read */
1076     while (retries <= 1) {
1077         /* check signature */
1078         if ((ide_inb(device,ATA_SECT_CNT) == 0x01) &&
1079                  (ide_inb(device,ATA_SECT_NUM) == 0x01) &&
1080                  (ide_inb(device,ATA_CYL_LOW)  == 0x14) &&
1081                  (ide_inb(device,ATA_CYL_HIGH) == 0xEB)) {
1082                 /* ATAPI Signature found */
1083                 dev_desc->if_type=IF_TYPE_ATAPI;
1084                 /* Start Ident Command
1085                  */
1086                 ide_outb (device, ATA_COMMAND, ATAPI_CMD_IDENT);
1087                 /*
1088                  * Wait for completion - ATAPI devices need more time
1089                  * to become ready
1090                  */
1091                 c = ide_wait (device, ATAPI_TIME_OUT);
1092         } else
1093 #endif
1094         {
1095                 /* Start Ident Command
1096                  */
1097                 ide_outb (device, ATA_COMMAND, ATA_CMD_IDENT);
1098
1099                 /* Wait for completion
1100                  */
1101                 c = ide_wait (device, IDE_TIME_OUT);
1102         }
1103         ide_led (DEVICE_LED(device), 0);        /* LED off      */
1104
1105         if (((c & ATA_STAT_DRQ) == 0) ||
1106             ((c & (ATA_STAT_FAULT|ATA_STAT_ERR)) != 0) ) {
1107 #ifdef CONFIG_ATAPI
1108 #ifdef CONFIG_AMIGAONEG3SE
1109                 s = getenv("ide_doreset");
1110                 if (s && strcmp(s, "on") == 0)
1111 #endif
1112                 {
1113                         /* Need to soft reset the device in case it's an ATAPI...  */
1114                         debug ("Retrying...\n");
1115                         ide_outb (device, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(device));
1116                         udelay(100000);
1117                         ide_outb (device, ATA_COMMAND, 0x08);
1118                         udelay (500000);        /* 500 ms */
1119                 }
1120                 /* Select device
1121                  */
1122                 ide_outb (device, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(device));
1123                 retries++;
1124 #else
1125                 return;
1126 #endif
1127         }
1128 #ifdef CONFIG_ATAPI
1129         else
1130                 break;
1131     }   /* see above - ugly to read */
1132
1133         if (retries == 2) /* Not found */
1134                 return;
1135 #endif
1136
1137         input_swap_data (device, iobuf, ATA_SECTORWORDS);
1138
1139         ident_cpy ((unsigned char*)dev_desc->revision, iop->fw_rev, sizeof(dev_desc->revision));
1140         ident_cpy ((unsigned char*)dev_desc->vendor, iop->model, sizeof(dev_desc->vendor));
1141         ident_cpy ((unsigned char*)dev_desc->product, iop->serial_no, sizeof(dev_desc->product));
1142 #ifdef __LITTLE_ENDIAN
1143         /*
1144          * firmware revision and model number have Big Endian Byte
1145          * order in Word. Convert both to little endian.
1146          *
1147          * See CF+ and CompactFlash Specification Revision 2.0:
1148          * 6.2.1.6: Identfy Drive, Table 39 for more details
1149          */
1150
1151         strswab (dev_desc->revision);
1152         strswab (dev_desc->vendor);
1153 #endif /* __LITTLE_ENDIAN */
1154
1155         if ((iop->config & 0x0080)==0x0080)
1156                 dev_desc->removable = 1;
1157         else
1158                 dev_desc->removable = 0;
1159
1160 #if 0
1161         /*
1162          * Drive PIO mode autoselection
1163          */
1164         mode = iop->tPIO;
1165
1166         printf ("tPIO = 0x%02x = %d\n",mode, mode);
1167         if (mode > 2) {         /* 2 is maximum allowed tPIO value */
1168                 mode = 2;
1169                 debug ("Override tPIO -> 2\n");
1170         }
1171         if (iop->field_valid & 2) {     /* drive implements ATA2? */
1172                 debug ("Drive implements ATA2\n");
1173                 if (iop->capability & 8) {      /* drive supports use_iordy? */
1174                         cycle_time = iop->eide_pio_iordy;
1175                 } else {
1176                         cycle_time = iop->eide_pio;
1177                 }
1178                 debug ("cycle time = %d\n", cycle_time);
1179                 mode = 4;
1180                 if (cycle_time > 120) mode = 3; /* 120 ns for PIO mode 4 */
1181                 if (cycle_time > 180) mode = 2; /* 180 ns for PIO mode 3 */
1182                 if (cycle_time > 240) mode = 1; /* 240 ns for PIO mode 4 */
1183                 if (cycle_time > 383) mode = 0; /* 383 ns for PIO mode 4 */
1184         }
1185         printf ("PIO mode to use: PIO %d\n", mode);
1186 #endif /* 0 */
1187
1188 #ifdef CONFIG_ATAPI
1189         if (dev_desc->if_type==IF_TYPE_ATAPI) {
1190                 atapi_inquiry(dev_desc);
1191                 return;
1192         }
1193 #endif /* CONFIG_ATAPI */
1194
1195 #ifdef __BIG_ENDIAN
1196         /* swap shorts */
1197         dev_desc->lba = (iop->lba_capacity << 16) | (iop->lba_capacity >> 16);
1198 #else   /* ! __BIG_ENDIAN */
1199         /*
1200          * do not swap shorts on little endian
1201          *
1202          * See CF+ and CompactFlash Specification Revision 2.0:
1203          * 6.2.1.6: Identfy Drive, Table 39, Word Address 57-58 for details.
1204          */
1205         dev_desc->lba = iop->lba_capacity;
1206 #endif  /* __BIG_ENDIAN */
1207
1208 #ifdef CONFIG_LBA48
1209         if (iop->command_set_2 & 0x0400) { /* LBA 48 support */
1210                 dev_desc->lba48 = 1;
1211                 dev_desc->lba = (unsigned long long)iop->lba48_capacity[0] |
1212                                                   ((unsigned long long)iop->lba48_capacity[1] << 16) |
1213                                                   ((unsigned long long)iop->lba48_capacity[2] << 32) |
1214                                                   ((unsigned long long)iop->lba48_capacity[3] << 48);
1215         } else {
1216                 dev_desc->lba48 = 0;
1217         }
1218 #endif /* CONFIG_LBA48 */
1219         /* assuming HD */
1220         dev_desc->type=DEV_TYPE_HARDDISK;
1221         dev_desc->blksz=ATA_BLOCKSIZE;
1222         dev_desc->lun=0; /* just to fill something in... */
1223
1224 #if 0   /* only used to test the powersaving mode,
1225          * if enabled, the drive goes after 5 sec
1226          * in standby mode */
1227         ide_outb (device, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(device));
1228         c = ide_wait (device, IDE_TIME_OUT);
1229         ide_outb (device, ATA_SECT_CNT, 1);
1230         ide_outb (device, ATA_LBA_LOW,  0);
1231         ide_outb (device, ATA_LBA_MID,  0);
1232         ide_outb (device, ATA_LBA_HIGH, 0);
1233         ide_outb (device, ATA_DEV_HD,   ATA_LBA | ATA_DEVICE(device));
1234         ide_outb (device, ATA_COMMAND,  0xe3);
1235         udelay (50);
1236         c = ide_wait (device, IDE_TIME_OUT);    /* can't take over 500 ms */
1237 #endif
1238 }
1239
1240
1241 /* ------------------------------------------------------------------------- */
1242
1243 ulong ide_read (int device, lbaint_t blknr, ulong blkcnt, void *buffer)
1244 {
1245         ulong n = 0;
1246         unsigned char c;
1247         unsigned char pwrsave=0; /* power save */
1248 #ifdef CONFIG_LBA48
1249         unsigned char lba48 = 0;
1250
1251         if (blknr & 0x0000fffff0000000) {
1252                 /* more than 28 bits used, use 48bit mode */
1253                 lba48 = 1;
1254         }
1255 #endif
1256         debug ("ide_read dev %d start %qX, blocks %lX buffer at %lX\n",
1257                 device, blknr, blkcnt, (ulong)buffer);
1258
1259         ide_led (DEVICE_LED(device), 1);        /* LED on       */
1260
1261         /* Select device
1262          */
1263         ide_outb (device, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(device));
1264         c = ide_wait (device, IDE_TIME_OUT);
1265
1266         if (c & ATA_STAT_BUSY) {
1267                 printf ("IDE read: device %d not ready\n", device);
1268                 goto IDE_READ_E;
1269         }
1270
1271         /* first check if the drive is in Powersaving mode, if yes,
1272          * increase the timeout value */
1273         ide_outb (device, ATA_COMMAND,  ATA_CMD_CHK_PWR);
1274         udelay (50);
1275
1276         c = ide_wait (device, IDE_TIME_OUT);    /* can't take over 500 ms */
1277
1278         if (c & ATA_STAT_BUSY) {
1279                 printf ("IDE read: device %d not ready\n", device);
1280                 goto IDE_READ_E;
1281         }
1282         if ((c & ATA_STAT_ERR) == ATA_STAT_ERR) {
1283                 printf ("No Powersaving mode %X\n", c);
1284         } else {
1285                 c = ide_inb(device,ATA_SECT_CNT);
1286                 debug ("Powersaving %02X\n",c);
1287                 if(c==0)
1288                         pwrsave=1;
1289         }
1290
1291
1292         while (blkcnt-- > 0) {
1293
1294                 c = ide_wait (device, IDE_TIME_OUT);
1295
1296                 if (c & ATA_STAT_BUSY) {
1297                         printf ("IDE read: device %d not ready\n", device);
1298                         break;
1299                 }
1300 #ifdef CONFIG_LBA48
1301                 if (lba48) {
1302                         /* write high bits */
1303                         ide_outb (device, ATA_SECT_CNT, 0);
1304                         ide_outb (device, ATA_LBA_LOW,  (blknr >> 24) & 0xFF);
1305                         ide_outb (device, ATA_LBA_MID,  (blknr >> 32) & 0xFF);
1306                         ide_outb (device, ATA_LBA_HIGH, (blknr >> 40) & 0xFF);
1307                 }
1308 #endif
1309                 ide_outb (device, ATA_SECT_CNT, 1);
1310                 ide_outb (device, ATA_LBA_LOW,  (blknr >>  0) & 0xFF);
1311                 ide_outb (device, ATA_LBA_MID,  (blknr >>  8) & 0xFF);
1312                 ide_outb (device, ATA_LBA_HIGH, (blknr >> 16) & 0xFF);
1313
1314 #ifdef CONFIG_LBA48
1315                 if (lba48) {
1316                         ide_outb (device, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(device) );
1317                         ide_outb (device, ATA_COMMAND, ATA_CMD_READ_EXT);
1318
1319                 } else
1320 #endif
1321                 {
1322                         ide_outb (device, ATA_DEV_HD,   ATA_LBA         |
1323                                                     ATA_DEVICE(device)  |
1324                                                     ((blknr >> 24) & 0xF) );
1325                         ide_outb (device, ATA_COMMAND,  ATA_CMD_READ);
1326                 }
1327
1328                 udelay (50);
1329
1330                 if(pwrsave) {
1331                         c = ide_wait (device, IDE_SPIN_UP_TIME_OUT);    /* may take up to 4 sec */
1332                         pwrsave=0;
1333                 } else {
1334                         c = ide_wait (device, IDE_TIME_OUT);    /* can't take over 500 ms */
1335                 }
1336
1337                 if ((c&(ATA_STAT_DRQ|ATA_STAT_BUSY|ATA_STAT_ERR)) != ATA_STAT_DRQ) {
1338 #if defined(CFG_64BIT_LBA) && defined(CFG_64BIT_VSPRINTF)
1339                         printf ("Error (no IRQ) dev %d blk %qd: status 0x%02x\n",
1340                                 device, blknr, c);
1341 #else
1342                         printf ("Error (no IRQ) dev %d blk %ld: status 0x%02x\n",
1343                                 device, (ulong)blknr, c);
1344 #endif
1345                         break;
1346                 }
1347
1348                 input_data (device, buffer, ATA_SECTORWORDS);
1349                 (void) ide_inb (device, ATA_STATUS);    /* clear IRQ */
1350
1351                 ++n;
1352                 ++blknr;
1353                 buffer += ATA_BLOCKSIZE;
1354         }
1355 IDE_READ_E:
1356         ide_led (DEVICE_LED(device), 0);        /* LED off      */
1357         return (n);
1358 }
1359
1360 /* ------------------------------------------------------------------------- */
1361
1362
1363 ulong ide_write (int device, lbaint_t blknr, ulong blkcnt, void *buffer)
1364 {
1365         ulong n = 0;
1366         unsigned char c;
1367 #ifdef CONFIG_LBA48
1368         unsigned char lba48 = 0;
1369
1370         if (blknr & 0x0000fffff0000000) {
1371                 /* more than 28 bits used, use 48bit mode */
1372                 lba48 = 1;
1373         }
1374 #endif
1375
1376         ide_led (DEVICE_LED(device), 1);        /* LED on       */
1377
1378         /* Select device
1379          */
1380         ide_outb (device, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(device));
1381
1382         while (blkcnt-- > 0) {
1383
1384                 c = ide_wait (device, IDE_TIME_OUT);
1385
1386                 if (c & ATA_STAT_BUSY) {
1387                         printf ("IDE read: device %d not ready\n", device);
1388                         goto WR_OUT;
1389                 }
1390 #ifdef CONFIG_LBA48
1391                 if (lba48) {
1392                         /* write high bits */
1393                         ide_outb (device, ATA_SECT_CNT, 0);
1394                         ide_outb (device, ATA_LBA_LOW,  (blknr >> 24) & 0xFF);
1395                         ide_outb (device, ATA_LBA_MID,  (blknr >> 32) & 0xFF);
1396                         ide_outb (device, ATA_LBA_HIGH, (blknr >> 40) & 0xFF);
1397                 }
1398 #endif
1399                 ide_outb (device, ATA_SECT_CNT, 1);
1400                 ide_outb (device, ATA_LBA_LOW,  (blknr >>  0) & 0xFF);
1401                 ide_outb (device, ATA_LBA_MID,  (blknr >>  8) & 0xFF);
1402                 ide_outb (device, ATA_LBA_HIGH, (blknr >> 16) & 0xFF);
1403
1404 #ifdef CONFIG_LBA48
1405                 if (lba48) {
1406                         ide_outb (device, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(device) );
1407                         ide_outb (device, ATA_COMMAND,  ATA_CMD_WRITE_EXT);
1408
1409                 } else
1410 #endif
1411                 {
1412                         ide_outb (device, ATA_DEV_HD,   ATA_LBA         |
1413                                                     ATA_DEVICE(device)  |
1414                                                     ((blknr >> 24) & 0xF) );
1415                         ide_outb (device, ATA_COMMAND,  ATA_CMD_WRITE);
1416                 }
1417
1418                 udelay (50);
1419
1420                 c = ide_wait (device, IDE_TIME_OUT);    /* can't take over 500 ms */
1421
1422                 if ((c&(ATA_STAT_DRQ|ATA_STAT_BUSY|ATA_STAT_ERR)) != ATA_STAT_DRQ) {
1423 #if defined(CFG_64BIT_LBA) && defined(CFG_64BIT_VSPRINTF)
1424                         printf ("Error (no IRQ) dev %d blk %qd: status 0x%02x\n",
1425                                 device, blknr, c);
1426 #else
1427                         printf ("Error (no IRQ) dev %d blk %ld: status 0x%02x\n",
1428                                 device, (ulong)blknr, c);
1429 #endif
1430                         goto WR_OUT;
1431                 }
1432
1433                 output_data (device, buffer, ATA_SECTORWORDS);
1434                 c = ide_inb (device, ATA_STATUS);       /* clear IRQ */
1435                 ++n;
1436                 ++blknr;
1437                 buffer += ATA_BLOCKSIZE;
1438         }
1439 WR_OUT:
1440         ide_led (DEVICE_LED(device), 0);        /* LED off      */
1441         return (n);
1442 }
1443
1444 /* ------------------------------------------------------------------------- */
1445
1446 /*
1447  * copy src to dest, skipping leading and trailing blanks and null
1448  * terminate the string
1449  * "len" is the size of available memory including the terminating '\0'
1450  */
1451 static void ident_cpy (unsigned char *dst, unsigned char *src, unsigned int len)
1452 {
1453         unsigned char *end, *last;
1454
1455         last = dst;
1456         end  = src + len - 1;
1457
1458         /* reserve space for '\0' */
1459         if (len < 2)
1460                 goto OUT;
1461
1462         /* skip leading white space */
1463         while ((*src) && (src<end) && (*src==' '))
1464                 ++src;
1465
1466         /* copy string, omitting trailing white space */
1467         while ((*src) && (src<end)) {
1468                 *dst++ = *src;
1469                 if (*src++ != ' ')
1470                         last = dst;
1471         }
1472 OUT:
1473         *last = '\0';
1474 }
1475
1476 /* ------------------------------------------------------------------------- */
1477
1478 /*
1479  * Wait until Busy bit is off, or timeout (in ms)
1480  * Return last status
1481  */
1482 static uchar ide_wait (int dev, ulong t)
1483 {
1484         ulong delay = 10 * t;           /* poll every 100 us */
1485         uchar c;
1486
1487         while ((c = ide_inb(dev, ATA_STATUS)) & ATA_STAT_BUSY) {
1488                 udelay (100);
1489                 if (delay-- == 0) {
1490                         break;
1491                 }
1492         }
1493         return (c);
1494 }
1495
1496 /* ------------------------------------------------------------------------- */
1497
1498 #ifdef CONFIG_IDE_RESET
1499 extern void ide_set_reset(int idereset);
1500
1501 static void ide_reset (void)
1502 {
1503 #if defined(CFG_PB_12V_ENABLE) || defined(CFG_PB_IDE_MOTOR)
1504         volatile immap_t *immr = (immap_t *)CFG_IMMR;
1505 #endif
1506         int i;
1507
1508         curr_device = -1;
1509         for (i=0; i<CFG_IDE_MAXBUS; ++i)
1510                 ide_bus_ok[i] = 0;
1511         for (i=0; i<CFG_IDE_MAXDEVICE; ++i)
1512                 ide_dev_desc[i].type = DEV_TYPE_UNKNOWN;
1513
1514         ide_set_reset (1); /* assert reset */
1515
1516         WATCHDOG_RESET();
1517
1518 #ifdef CFG_PB_12V_ENABLE
1519         immr->im_cpm.cp_pbdat &= ~(CFG_PB_12V_ENABLE);  /* 12V Enable output OFF */
1520         immr->im_cpm.cp_pbpar &= ~(CFG_PB_12V_ENABLE);
1521         immr->im_cpm.cp_pbodr &= ~(CFG_PB_12V_ENABLE);
1522         immr->im_cpm.cp_pbdir |=   CFG_PB_12V_ENABLE;
1523
1524         /* wait 500 ms for the voltage to stabilize
1525          */
1526         for (i=0; i<500; ++i) {
1527                 udelay (1000);
1528         }
1529
1530         immr->im_cpm.cp_pbdat |=   CFG_PB_12V_ENABLE;   /* 12V Enable output ON */
1531 #endif  /* CFG_PB_12V_ENABLE */
1532
1533 #ifdef CFG_PB_IDE_MOTOR
1534         /* configure IDE Motor voltage monitor pin as input */
1535         immr->im_cpm.cp_pbpar &= ~(CFG_PB_IDE_MOTOR);
1536         immr->im_cpm.cp_pbodr &= ~(CFG_PB_IDE_MOTOR);
1537         immr->im_cpm.cp_pbdir &= ~(CFG_PB_IDE_MOTOR);
1538
1539         /* wait up to 1 s for the motor voltage to stabilize
1540          */
1541         for (i=0; i<1000; ++i) {
1542                 if ((immr->im_cpm.cp_pbdat & CFG_PB_IDE_MOTOR) != 0) {
1543                         break;
1544                 }
1545                 udelay (1000);
1546         }
1547
1548         if (i == 1000) {        /* Timeout */
1549                 printf ("\nWarning: 5V for IDE Motor missing\n");
1550 # ifdef CONFIG_STATUS_LED
1551 #  ifdef STATUS_LED_YELLOW
1552                 status_led_set  (STATUS_LED_YELLOW, STATUS_LED_ON );
1553 #  endif
1554 #  ifdef STATUS_LED_GREEN
1555                 status_led_set  (STATUS_LED_GREEN,  STATUS_LED_OFF);
1556 #  endif
1557 # endif /* CONFIG_STATUS_LED */
1558         }
1559 #endif  /* CFG_PB_IDE_MOTOR */
1560
1561         WATCHDOG_RESET();
1562
1563         /* de-assert RESET signal */
1564         ide_set_reset(0);
1565
1566         /* wait 250 ms */
1567         for (i=0; i<250; ++i) {
1568                 udelay (1000);
1569         }
1570 }
1571
1572 #endif  /* CONFIG_IDE_RESET */
1573
1574 /* ------------------------------------------------------------------------- */
1575
1576 #if defined(CONFIG_IDE_LED)     && \
1577    !defined(CONFIG_AMIGAONEG3SE)&& \
1578    !defined(CONFIG_CPC45)       && \
1579    !defined(CONFIG_HMI10)       && \
1580    !defined(CONFIG_KUP4K)       && \
1581    !defined(CONFIG_KUP4X)
1582
1583 static  uchar   led_buffer = 0;         /* Buffer for current LED status        */
1584
1585 static void ide_led (uchar led, uchar status)
1586 {
1587         uchar *led_port = LED_PORT;
1588
1589         if (status)     {               /* switch LED on        */
1590                 led_buffer |=  led;
1591         } else {                        /* switch LED off       */
1592                 led_buffer &= ~led;
1593         }
1594
1595         *led_port = led_buffer;
1596 }
1597
1598 #endif  /* CONFIG_IDE_LED */
1599
1600 /* ------------------------------------------------------------------------- */
1601
1602 #ifdef CONFIG_ATAPI
1603 /****************************************************************************
1604  * ATAPI Support
1605  */
1606
1607 #if defined(__PPC__) || defined(CONFIG_PXA_PCMCIA)
1608 /* since ATAPI may use commands with not 4 bytes alligned length
1609  * we have our own transfer functions, 2 bytes alligned */
1610 static void
1611 output_data_shorts(int dev, ushort *sect_buf, int shorts)
1612 {
1613 #if defined(CONFIG_HMI10) || defined(CONFIG_CPC45)
1614         uchar   *dbuf;
1615         volatile uchar  *pbuf_even;
1616         volatile uchar  *pbuf_odd;
1617
1618         pbuf_even = (uchar *)(ATA_CURR_BASE(dev)+ATA_DATA_EVEN);
1619         pbuf_odd  = (uchar *)(ATA_CURR_BASE(dev)+ATA_DATA_ODD);
1620         while (shorts--) {
1621                 EIEIO;
1622                 *pbuf_even = *dbuf++;
1623                 EIEIO;
1624                 *pbuf_odd = *dbuf++;
1625         }
1626 #else
1627         ushort  *dbuf;
1628         volatile ushort *pbuf;
1629
1630         pbuf = (ushort *)(ATA_CURR_BASE(dev)+ATA_DATA_REG);
1631         dbuf = (ushort *)sect_buf;
1632
1633         debug ("in output data shorts base for read is %lx\n", (unsigned long) pbuf);
1634
1635         while (shorts--) {
1636                 EIEIO;
1637                 *pbuf = *dbuf++;
1638         }
1639 #endif
1640 }
1641
1642 static void
1643 input_data_shorts(int dev, ushort *sect_buf, int shorts)
1644 {
1645 #if defined(CONFIG_HMI10) || defined(CONFIG_CPC45)
1646         uchar   *dbuf;
1647         volatile uchar  *pbuf_even;
1648         volatile uchar  *pbuf_odd;
1649
1650         pbuf_even = (uchar *)(ATA_CURR_BASE(dev)+ATA_DATA_EVEN);
1651         pbuf_odd  = (uchar *)(ATA_CURR_BASE(dev)+ATA_DATA_ODD);
1652         while (shorts--) {
1653                 EIEIO;
1654                 *dbuf++ = *pbuf_even;
1655                 EIEIO;
1656                 *dbuf++ = *pbuf_odd;
1657         }
1658 #else
1659         ushort  *dbuf;
1660         volatile ushort *pbuf;
1661
1662         pbuf = (ushort *)(ATA_CURR_BASE(dev)+ATA_DATA_REG);
1663         dbuf = (ushort *)sect_buf;
1664
1665         debug("in input data shorts base for read is %lx\n", (unsigned long) pbuf);
1666
1667         while (shorts--) {
1668                 EIEIO;
1669                 *dbuf++ = *pbuf;
1670         }
1671 #endif
1672 }
1673
1674 #else   /* ! __PPC__ */
1675 static void
1676 output_data_shorts(int dev, ushort *sect_buf, int shorts)
1677 {
1678         outsw(ATA_CURR_BASE(dev)+ATA_DATA_REG, sect_buf, shorts);
1679 }
1680
1681 static void
1682 input_data_shorts(int dev, ushort *sect_buf, int shorts)
1683 {
1684         insw(ATA_CURR_BASE(dev)+ATA_DATA_REG, sect_buf, shorts);
1685 }
1686
1687 #endif  /* __PPC__ */
1688
1689 /*
1690  * Wait until (Status & mask) == res, or timeout (in ms)
1691  * Return last status
1692  * This is used since some ATAPI CD ROMs clears their Busy Bit first
1693  * and then they set their DRQ Bit
1694  */
1695 static uchar atapi_wait_mask (int dev, ulong t,uchar mask, uchar res)
1696 {
1697         ulong delay = 10 * t;           /* poll every 100 us */
1698         uchar c;
1699
1700         c = ide_inb(dev,ATA_DEV_CTL); /* prevents to read the status before valid */
1701         while (((c = ide_inb(dev, ATA_STATUS)) & mask) != res) {
1702                 /* break if error occurs (doesn't make sense to wait more) */
1703                 if((c & ATA_STAT_ERR)==ATA_STAT_ERR)
1704                         break;
1705                 udelay (100);
1706                 if (delay-- == 0) {
1707                         break;
1708                 }
1709         }
1710         return (c);
1711 }
1712
1713 /*
1714  * issue an atapi command
1715  */
1716 unsigned char atapi_issue(int device,unsigned char* ccb,int ccblen, unsigned char * buffer,int buflen)
1717 {
1718         unsigned char c,err,mask,res;
1719         int n;
1720         ide_led (DEVICE_LED(device), 1);        /* LED on       */
1721
1722         /* Select device
1723          */
1724         mask = ATA_STAT_BUSY|ATA_STAT_DRQ;
1725         res = 0;
1726 #ifdef  CONFIG_AMIGAONEG3SE
1727 # warning THF: Removed LBA mode ???
1728 #endif
1729         ide_outb (device, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(device));
1730         c = atapi_wait_mask(device,ATAPI_TIME_OUT,mask,res);
1731         if ((c & mask) != res) {
1732                 printf ("ATAPI_ISSUE: device %d not ready status %X\n", device,c);
1733                 err=0xFF;
1734                 goto AI_OUT;
1735         }
1736         /* write taskfile */
1737         ide_outb (device, ATA_ERROR_REG, 0); /* no DMA, no overlaped */
1738         ide_outb (device, ATA_SECT_CNT, 0);
1739         ide_outb (device, ATA_SECT_NUM, 0);
1740         ide_outb (device, ATA_CYL_LOW,  (unsigned char)(buflen & 0xFF));
1741         ide_outb (device, ATA_CYL_HIGH, (unsigned char)((buflen>>8) & 0xFF));
1742 #ifdef  CONFIG_AMIGAONEG3SE
1743 # warning THF: Removed LBA mode ???
1744 #endif
1745         ide_outb (device, ATA_DEV_HD,   ATA_LBA | ATA_DEVICE(device));
1746
1747         ide_outb (device, ATA_COMMAND,  ATAPI_CMD_PACKET);
1748         udelay (50);
1749
1750         mask = ATA_STAT_DRQ|ATA_STAT_BUSY|ATA_STAT_ERR;
1751         res = ATA_STAT_DRQ;
1752         c = atapi_wait_mask(device,ATAPI_TIME_OUT,mask,res);
1753
1754         if ((c & mask) != res) { /* DRQ must be 1, BSY 0 */
1755                 printf ("ATTAPI_ISSUE: Error (no IRQ) before sending ccb dev %d status 0x%02x\n",device,c);
1756                 err=0xFF;
1757                 goto AI_OUT;
1758         }
1759
1760         output_data_shorts (device, (unsigned short *)ccb,ccblen/2); /* write command block */
1761         /* ATAPI Command written wait for completition */
1762         udelay (5000); /* device must set bsy */
1763
1764         mask = ATA_STAT_DRQ|ATA_STAT_BUSY|ATA_STAT_ERR;
1765         /* if no data wait for DRQ = 0 BSY = 0
1766          * if data wait for DRQ = 1 BSY = 0 */
1767         res=0;
1768         if(buflen)
1769                 res = ATA_STAT_DRQ;
1770         c = atapi_wait_mask(device,ATAPI_TIME_OUT,mask,res);
1771         if ((c & mask) != res ) {
1772                 if (c & ATA_STAT_ERR) {
1773                         err=(ide_inb(device,ATA_ERROR_REG))>>4;
1774                         debug ("atapi_issue 1 returned sense key %X status %02X\n",err,c);
1775                 } else {
1776                         printf ("ATTAPI_ISSUE: (no DRQ) after sending ccb (%x)  status 0x%02x\n", ccb[0],c);
1777                         err=0xFF;
1778                 }
1779                 goto AI_OUT;
1780         }
1781         n=ide_inb(device, ATA_CYL_HIGH);
1782         n<<=8;
1783         n+=ide_inb(device, ATA_CYL_LOW);
1784         if(n>buflen) {
1785                 printf("ERROR, transfer bytes %d requested only %d\n",n,buflen);
1786                 err=0xff;
1787                 goto AI_OUT;
1788         }
1789         if((n==0)&&(buflen<0)) {
1790                 printf("ERROR, transfer bytes %d requested %d\n",n,buflen);
1791                 err=0xff;
1792                 goto AI_OUT;
1793         }
1794         if(n!=buflen) {
1795                 debug ("WARNING, transfer bytes %d not equal with requested %d\n",n,buflen);
1796         }
1797         if(n!=0) { /* data transfer */
1798                 debug ("ATAPI_ISSUE: %d Bytes to transfer\n",n);
1799                  /* we transfer shorts */
1800                 n>>=1;
1801                 /* ok now decide if it is an in or output */
1802                 if ((ide_inb(device, ATA_SECT_CNT)&0x02)==0) {
1803                         debug ("Write to device\n");
1804                         output_data_shorts(device,(unsigned short *)buffer,n);
1805                 } else {
1806                         debug ("Read from device @ %p shorts %d\n",buffer,n);
1807                         input_data_shorts(device,(unsigned short *)buffer,n);
1808                 }
1809         }
1810         udelay(5000); /* seems that some CD ROMs need this... */
1811         mask = ATA_STAT_BUSY|ATA_STAT_ERR;
1812         res=0;
1813         c = atapi_wait_mask(device,ATAPI_TIME_OUT,mask,res);
1814         if ((c & ATA_STAT_ERR) == ATA_STAT_ERR) {
1815                 err=(ide_inb(device,ATA_ERROR_REG) >> 4);
1816                 debug ("atapi_issue 2 returned sense key %X status %X\n",err,c);
1817         } else {
1818                 err = 0;
1819         }
1820 AI_OUT:
1821         ide_led (DEVICE_LED(device), 0);        /* LED off      */
1822         return (err);
1823 }
1824
1825 /*
1826  * sending the command to atapi_issue. If an status other than good
1827  * returns, an request_sense will be issued
1828  */
1829
1830 #define ATAPI_DRIVE_NOT_READY   100
1831 #define ATAPI_UNIT_ATTN         10
1832
1833 unsigned char atapi_issue_autoreq (int device,
1834                                    unsigned char* ccb,
1835                                    int ccblen,
1836                                    unsigned char *buffer,
1837                                    int buflen)
1838 {
1839         unsigned char sense_data[18],sense_ccb[12];
1840         unsigned char res,key,asc,ascq;
1841         int notready,unitattn;
1842
1843 #ifdef CONFIG_AMIGAONEG3SE
1844         char *s;
1845         unsigned int timeout, retrycnt;
1846
1847         s = getenv("ide_cd_timeout");
1848         timeout = s ? (simple_strtol(s, NULL, 10)*1000000)/5 : 0;
1849
1850         retrycnt = 0;
1851 #endif
1852
1853         unitattn=ATAPI_UNIT_ATTN;
1854         notready=ATAPI_DRIVE_NOT_READY;
1855
1856 retry:
1857         res= atapi_issue(device,ccb,ccblen,buffer,buflen);
1858         if (res==0)
1859                 return (0); /* Ok */
1860
1861         if (res==0xFF)
1862                 return (0xFF); /* error */
1863
1864         debug ("(auto_req)atapi_issue returned sense key %X\n",res);
1865
1866         memset(sense_ccb,0,sizeof(sense_ccb));
1867         memset(sense_data,0,sizeof(sense_data));
1868         sense_ccb[0]=ATAPI_CMD_REQ_SENSE;
1869         sense_ccb[4]=18; /* allocation Length */
1870
1871         res=atapi_issue(device,sense_ccb,12,sense_data,18);
1872         key=(sense_data[2]&0xF);
1873         asc=(sense_data[12]);
1874         ascq=(sense_data[13]);
1875
1876         debug ("ATAPI_CMD_REQ_SENSE returned %x\n",res);
1877         debug (" Sense page: %02X key %02X ASC %02X ASCQ %02X\n",
1878                 sense_data[0],
1879                 key,
1880                 asc,
1881                 ascq);
1882
1883         if((key==0))
1884                 return 0; /* ok device ready */
1885
1886         if((key==6)|| (asc==0x29) || (asc==0x28)) { /* Unit Attention */
1887                 if(unitattn-->0) {
1888                         udelay(200*1000);
1889                         goto retry;
1890                 }
1891                 printf("Unit Attention, tried %d\n",ATAPI_UNIT_ATTN);
1892                 goto error;
1893         }
1894         if((asc==0x4) && (ascq==0x1)) { /* not ready, but will be ready soon */
1895                 if (notready-->0) {
1896                         udelay(200*1000);
1897                         goto retry;
1898                 }
1899                 printf("Drive not ready, tried %d times\n",ATAPI_DRIVE_NOT_READY);
1900                 goto error;
1901         }
1902         if(asc==0x3a) {
1903                 debug ("Media not present\n");
1904                 goto error;
1905         }
1906
1907 #ifdef CONFIG_AMIGAONEG3SE
1908         if ((sense_data[2]&0xF)==0x0B) {
1909                 debug ("ABORTED COMMAND...retry\n");
1910                 if (retrycnt++ < 4)
1911                         goto retry;
1912                 return (0xFF);
1913         }
1914
1915         if ((sense_data[2]&0xf) == 0x02 &&
1916             sense_data[12] == 0x04      &&
1917             sense_data[13] == 0x01      ) {
1918                 debug ("Waiting for unit to become active\n");
1919                 udelay(timeout);
1920                 if (retrycnt++ < 4)
1921                         goto retry;
1922                 return 0xFF;
1923         }
1924 #endif  /* CONFIG_AMIGAONEG3SE */
1925
1926         printf ("ERROR: Unknown Sense key %02X ASC %02X ASCQ %02X\n",key,asc,ascq);
1927 error:
1928         debug  ("ERROR Sense key %02X ASC %02X ASCQ %02X\n",key,asc,ascq);
1929         return (0xFF);
1930 }
1931
1932
1933 static void     atapi_inquiry(block_dev_desc_t * dev_desc)
1934 {
1935         unsigned char ccb[12]; /* Command descriptor block */
1936         unsigned char iobuf[64]; /* temp buf */
1937         unsigned char c;
1938         int device;
1939
1940         device=dev_desc->dev;
1941         dev_desc->type=DEV_TYPE_UNKNOWN; /* not yet valid */
1942         dev_desc->block_read=atapi_read;
1943
1944         memset(ccb,0,sizeof(ccb));
1945         memset(iobuf,0,sizeof(iobuf));
1946
1947         ccb[0]=ATAPI_CMD_INQUIRY;
1948         ccb[4]=40; /* allocation Legnth */
1949         c=atapi_issue_autoreq(device,ccb,12,(unsigned char *)iobuf,40);
1950
1951         debug ("ATAPI_CMD_INQUIRY returned %x\n",c);
1952         if (c!=0)
1953                 return;
1954
1955         /* copy device ident strings */
1956         ident_cpy((unsigned char*)dev_desc->vendor,&iobuf[8],8);
1957         ident_cpy((unsigned char*)dev_desc->product,&iobuf[16],16);
1958         ident_cpy((unsigned char*)dev_desc->revision,&iobuf[32],5);
1959
1960         dev_desc->lun=0;
1961         dev_desc->lba=0;
1962         dev_desc->blksz=0;
1963         dev_desc->type=iobuf[0] & 0x1f;
1964
1965         if ((iobuf[1]&0x80)==0x80)
1966                 dev_desc->removable = 1;
1967         else
1968                 dev_desc->removable = 0;
1969
1970         memset(ccb,0,sizeof(ccb));
1971         memset(iobuf,0,sizeof(iobuf));
1972         ccb[0]=ATAPI_CMD_START_STOP;
1973         ccb[4]=0x03; /* start */
1974
1975         c=atapi_issue_autoreq(device,ccb,12,(unsigned char *)iobuf,0);
1976
1977         debug ("ATAPI_CMD_START_STOP returned %x\n",c);
1978         if (c!=0)
1979                 return;
1980
1981         memset(ccb,0,sizeof(ccb));
1982         memset(iobuf,0,sizeof(iobuf));
1983         c=atapi_issue_autoreq(device,ccb,12,(unsigned char *)iobuf,0);
1984
1985         debug ("ATAPI_CMD_UNIT_TEST_READY returned %x\n",c);
1986         if (c!=0)
1987                 return;
1988
1989         memset(ccb,0,sizeof(ccb));
1990         memset(iobuf,0,sizeof(iobuf));
1991         ccb[0]=ATAPI_CMD_READ_CAP;
1992         c=atapi_issue_autoreq(device,ccb,12,(unsigned char *)iobuf,8);
1993         debug ("ATAPI_CMD_READ_CAP returned %x\n",c);
1994         if (c!=0)
1995                 return;
1996
1997         debug ("Read Cap: LBA %02X%02X%02X%02X blksize %02X%02X%02X%02X\n",
1998                 iobuf[0],iobuf[1],iobuf[2],iobuf[3],
1999                 iobuf[4],iobuf[5],iobuf[6],iobuf[7]);
2000
2001         dev_desc->lba  =((unsigned long)iobuf[0]<<24) +
2002                         ((unsigned long)iobuf[1]<<16) +
2003                         ((unsigned long)iobuf[2]<< 8) +
2004                         ((unsigned long)iobuf[3]);
2005         dev_desc->blksz=((unsigned long)iobuf[4]<<24) +
2006                         ((unsigned long)iobuf[5]<<16) +
2007                         ((unsigned long)iobuf[6]<< 8) +
2008                         ((unsigned long)iobuf[7]);
2009 #ifdef CONFIG_LBA48
2010         dev_desc->lba48 = 0; /* ATAPI devices cannot use 48bit addressing (ATA/ATAPI v7) */
2011 #endif
2012         return;
2013 }
2014
2015
2016 /*
2017  * atapi_read:
2018  * we transfer only one block per command, since the multiple DRQ per
2019  * command is not yet implemented
2020  */
2021 #define ATAPI_READ_MAX_BYTES    2048    /* we read max 2kbytes */
2022 #define ATAPI_READ_BLOCK_SIZE   2048    /* assuming CD part */
2023 #define ATAPI_READ_MAX_BLOCK ATAPI_READ_MAX_BYTES/ATAPI_READ_BLOCK_SIZE /* max blocks */
2024
2025 ulong atapi_read (int device, lbaint_t blknr, ulong blkcnt, void *buffer)
2026 {
2027         ulong n = 0;
2028         unsigned char ccb[12]; /* Command descriptor block */
2029         ulong cnt;
2030
2031         debug  ("atapi_read dev %d start %lX, blocks %lX buffer at %lX\n",
2032                 device, blknr, blkcnt, (ulong)buffer);
2033
2034         do {
2035                 if (blkcnt>ATAPI_READ_MAX_BLOCK) {
2036                         cnt=ATAPI_READ_MAX_BLOCK;
2037                 } else {
2038                         cnt=blkcnt;
2039                 }
2040                 ccb[0]=ATAPI_CMD_READ_12;
2041                 ccb[1]=0; /* reserved */
2042                 ccb[2]=(unsigned char) (blknr>>24) & 0xFF; /* MSB Block */
2043                 ccb[3]=(unsigned char) (blknr>>16) & 0xFF; /*  */
2044                 ccb[4]=(unsigned char) (blknr>> 8) & 0xFF;
2045                 ccb[5]=(unsigned char)  blknr      & 0xFF; /* LSB Block */
2046                 ccb[6]=(unsigned char) (cnt  >>24) & 0xFF; /* MSB Block count */
2047                 ccb[7]=(unsigned char) (cnt  >>16) & 0xFF;
2048                 ccb[8]=(unsigned char) (cnt  >> 8) & 0xFF;
2049                 ccb[9]=(unsigned char)  cnt        & 0xFF; /* LSB Block */
2050                 ccb[10]=0; /* reserved */
2051                 ccb[11]=0; /* reserved */
2052
2053                 if (atapi_issue_autoreq(device,ccb,12,
2054                                         (unsigned char *)buffer,
2055                                         cnt*ATAPI_READ_BLOCK_SIZE) == 0xFF) {
2056                         return (n);
2057                 }
2058                 n+=cnt;
2059                 blkcnt-=cnt;
2060                 blknr+=cnt;
2061                 buffer+=(cnt*ATAPI_READ_BLOCK_SIZE);
2062         } while (blkcnt > 0);
2063         return (n);
2064 }
2065
2066 /* ------------------------------------------------------------------------- */
2067
2068 #endif /* CONFIG_ATAPI */
2069
2070 U_BOOT_CMD(
2071         ide,  5,  1,  do_ide,
2072         "ide     - IDE sub-system\n",
2073         "reset - reset IDE controller\n"
2074         "ide info  - show available IDE devices\n"
2075         "ide device [dev] - show or set current device\n"
2076         "ide part [dev] - print partition table of one or all IDE devices\n"
2077         "ide read  addr blk# cnt\n"
2078         "ide write addr blk# cnt - read/write `cnt'"
2079         " blocks starting at block `blk#'\n"
2080         "    to/from memory address `addr'\n"
2081 );
2082
2083 U_BOOT_CMD(
2084         diskboot,       3,      1,      do_diskboot,
2085         "diskboot- boot from IDE device\n",
2086         "loadAddr dev:part\n"
2087 );
2088
2089 #endif