1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2002 by Alan Korr
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
34 #include "ata_idle_notify.h"
35 #include "ata-target.h"
36 #include "ata-defines.h"
39 #define SECTOR_SIZE 512
41 #define SELECT_DEVICE1 0x10
42 #define SELECT_LBA 0x40
44 #define CONTROL_nIEN 0x02
45 #define CONTROL_SRST 0x04
47 #define CMD_READ_SECTORS 0x20
48 #define CMD_WRITE_SECTORS 0x30
49 #define CMD_WRITE_SECTORS_EXT 0x34
50 #define CMD_READ_MULTIPLE 0xC4
51 #define CMD_READ_MULTIPLE_EXT 0x29
52 #define CMD_WRITE_MULTIPLE 0xC5
53 #define CMD_WRITE_MULTIPLE_EXT 0x39
54 #define CMD_SET_MULTIPLE_MODE 0xC6
55 #define CMD_STANDBY_IMMEDIATE 0xE0
56 #define CMD_STANDBY 0xE2
57 #define CMD_IDENTIFY 0xEC
58 #define CMD_SLEEP 0xE6
59 #define CMD_SET_FEATURES 0xEF
60 #define CMD_SECURITY_FREEZE_LOCK 0xF5
62 #define CMD_READ_DMA 0xC8
63 #define CMD_READ_DMA_EXT 0x25
64 #define CMD_WRITE_DMA 0xCA
65 #define CMD_WRITE_DMA_EXT 0x35
68 /* Should all be < 0x100 (which are reserved for control messages) */
72 #define READWRITE_TIMEOUT 5*HZ
74 #ifdef HAVE_ATA_POWER_OFF
75 #define ATA_POWER_OFF_TIMEOUT 2*HZ
78 #ifdef ATA_DRIVER_CLOSE
79 static unsigned int ata_thread_id
= 0;
82 #if defined(MAX_PHYS_SECTOR_SIZE) && MEMORYSIZE == 64
83 /* Hack - what's the deal with 5g? */
86 struct thread_entry
*thread
;
88 volatile unsigned char locked
;
89 IF_COP( struct corelock cl
; )
92 static void ata_lock_init(struct ata_lock
*l
)
94 corelock_init(&l
->cl
);
100 static void ata_lock_lock(struct ata_lock
*l
)
102 struct thread_entry
* const current
=
103 thread_id_entry(THREAD_ID_CURRENT
);
105 if (current
== l
->thread
)
111 corelock_lock(&l
->cl
);
113 IF_PRIO( current
->skip_count
= -1; )
115 while (l
->locked
!= 0)
117 corelock_unlock(&l
->cl
);
119 corelock_lock(&l
->cl
);
124 corelock_unlock(&l
->cl
);
127 static void ata_lock_unlock(struct ata_lock
*l
)
135 corelock_lock(&l
->cl
);
137 IF_PRIO( l
->thread
->skip_count
= 0; )
142 corelock_unlock(&l
->cl
);
145 #define mutex ata_lock
146 #define mutex_init ata_lock_init
147 #define mutex_lock ata_lock_lock
148 #define mutex_unlock ata_lock_unlock
149 #endif /* MAX_PHYS_SECTOR_SIZE */
151 #if defined(HAVE_USBSTACK) && defined(USE_ROCKBOX_USB)
152 #define ALLOW_USB_SPINDOWN
155 static struct mutex ata_mtx SHAREDBSS_ATTR
;
156 static int ata_device
; /* device 0 (master) or 1 (slave) */
158 static int spinup_time
= 0;
159 #if (CONFIG_LED == LED_REAL)
160 static bool ata_led_enabled
= true;
161 static bool ata_led_on
= false;
163 static bool spinup
= false;
164 static bool sleeping
= true;
165 static bool poweroff
= false;
166 static long sleep_timeout
= 5*HZ
;
168 static bool lba48
= false; /* set for 48 bit addressing */
170 static long ata_stack
[(DEFAULT_STACK_SIZE
*3)/sizeof(long)];
171 static const char ata_thread_name
[] = "ata";
172 static struct event_queue ata_queue SHAREDBSS_ATTR
;
173 static bool initialized
= false;
175 static long last_user_activity
= -1;
176 static long last_disk_activity
= -1;
178 static unsigned long total_sectors
;
179 static int multisectors
; /* number of supported multisectors */
180 static unsigned short identify_info
[SECTOR_SIZE
/2];
182 #ifdef MAX_PHYS_SECTOR_SIZE
184 struct sector_cache_entry
{
186 unsigned long sectornum
; /* logical sector */
187 unsigned char data
[MAX_PHYS_SECTOR_SIZE
];
189 /* buffer for reading and writing large physical sectors */
191 static struct sector_cache_entry sector_cache
;
192 static int phys_sector_mult
= 1;
196 static int dma_mode
= 0;
199 static int ata_power_on(void);
200 static int perform_soft_reset(void);
201 static int set_multiple_mode(int sectors
);
202 static int set_features(void);
204 #ifndef ATA_TARGET_POLLING
205 STATICIRAM ICODE_ATTR
int wait_for_bsy(void)
207 long timeout
= current_tick
+ HZ
*30;
211 if (!(ATA_IN8(ATA_STATUS
) & STATUS_BSY
))
213 last_disk_activity
= current_tick
;
215 } while (TIME_BEFORE(current_tick
, timeout
));
217 return 0; /* timeout */
220 STATICIRAM ICODE_ATTR
int wait_for_rdy(void)
227 timeout
= current_tick
+ HZ
*10;
231 if (ATA_IN8(ATA_ALT_STATUS
) & STATUS_RDY
)
233 last_disk_activity
= current_tick
;
235 } while (TIME_BEFORE(current_tick
, timeout
));
237 return 0; /* timeout */
240 extern int ata_wait_for_bsy(void);
241 extern int ata_wait_for_rdy(void);
242 #define wait_for_bsy ata_wait_for_bsy
243 #define wait_for_rdy ata_wait_for_rdy
246 STATICIRAM ICODE_ATTR
int wait_for_start_of_transfer(void)
251 return (ATA_IN8(ATA_ALT_STATUS
) & (STATUS_BSY
|STATUS_DRQ
)) == STATUS_DRQ
;
254 STATICIRAM ICODE_ATTR
int wait_for_end_of_transfer(void)
258 return (ATA_IN8(ATA_ALT_STATUS
) &
259 (STATUS_BSY
|STATUS_RDY
|STATUS_DF
|STATUS_DRQ
|STATUS_ERR
))
263 #if (CONFIG_LED == LED_REAL)
264 /* Conditionally block LED access for the ATA driver, so the LED can be
265 * (mis)used for other purposes */
266 static void ata_led(bool on
)
273 #define ata_led(on) led(on)
276 #ifndef ATA_OPTIMIZED_READING
277 STATICIRAM ICODE_ATTR
void copy_read_sectors(unsigned char* buf
, int wordcount
)
279 unsigned short tmp
= 0;
281 if ( (unsigned long)buf
& 1)
282 { /* not 16-bit aligned, copy byte by byte */
283 unsigned char* bufend
= buf
+ wordcount
*2;
286 tmp
= ATA_IN16(ATA_DATA
);
287 #if defined(ROCKBOX_LITTLE_ENDIAN)
288 *buf
++ = tmp
& 0xff; /* I assume big endian */
289 *buf
++ = tmp
>> 8; /* and don't use the SWAB16 macro */
294 } while (buf
< bufend
); /* tail loop is faster */
297 { /* 16-bit aligned, can do faster copy */
298 unsigned short* wbuf
= (unsigned short*)buf
;
299 unsigned short* wbufend
= wbuf
+ wordcount
;
302 *wbuf
= ATA_IN16(ATA_DATA
);
303 } while (++wbuf
< wbufend
); /* tail loop is faster */
306 #endif /* !ATA_OPTIMIZED_READING */
308 #ifndef ATA_OPTIMIZED_WRITING
309 STATICIRAM ICODE_ATTR
void copy_write_sectors(const unsigned char* buf
,
312 if ( (unsigned long)buf
& 1)
313 { /* not 16-bit aligned, copy byte by byte */
314 unsigned short tmp
= 0;
315 const unsigned char* bufend
= buf
+ wordcount
*2;
318 #if defined(ROCKBOX_LITTLE_ENDIAN)
319 tmp
= (unsigned short) *buf
++;
320 tmp
|= (unsigned short) *buf
++ << 8;
322 tmp
= (unsigned short) *buf
++ << 8;
323 tmp
|= (unsigned short) *buf
++;
325 ATA_OUT16(ATA_DATA
, tmp
);
326 } while (buf
< bufend
); /* tail loop is faster */
329 { /* 16-bit aligned, can do faster copy */
330 unsigned short* wbuf
= (unsigned short*)buf
;
331 unsigned short* wbufend
= wbuf
+ wordcount
;
334 ATA_OUT16(ATA_DATA
, *wbuf
);
335 } while (++wbuf
< wbufend
); /* tail loop is faster */
338 #endif /* !ATA_OPTIMIZED_WRITING */
340 static int ata_transfer_sectors(unsigned long start
,
354 #ifndef MAX_PHYS_SECTOR_SIZE
355 mutex_lock(&ata_mtx
);
358 if (start
+ incount
> total_sectors
) {
363 last_disk_activity
= current_tick
;
364 spinup_start
= current_tick
;
369 sleeping
= false; /* set this now since it'll be on */
372 if (ata_power_on()) {
378 if (perform_soft_reset()) {
385 timeout
= current_tick
+ READWRITE_TIMEOUT
;
387 ATA_OUT8(ATA_SELECT
, ata_device
);
397 while (TIME_BEFORE(current_tick
, timeout
)) {
399 last_disk_activity
= current_tick
;
402 /* If DMA is supported and parameters are ok for DMA, use it */
403 if (dma_mode
&& ata_dma_setup(inbuf
, incount
* SECTOR_SIZE
, write
))
410 ATA_OUT8(ATA_NSECTOR
, count
>> 8);
411 ATA_OUT8(ATA_NSECTOR
, count
& 0xff);
412 ATA_OUT8(ATA_SECTOR
, (start
>> 24) & 0xff); /* 31:24 */
413 ATA_OUT8(ATA_SECTOR
, start
& 0xff); /* 7:0 */
414 ATA_OUT8(ATA_LCYL
, 0); /* 39:32 */
415 ATA_OUT8(ATA_LCYL
, (start
>> 8) & 0xff); /* 15:8 */
416 ATA_OUT8(ATA_HCYL
, 0); /* 47:40 */
417 ATA_OUT8(ATA_HCYL
, (start
>> 16) & 0xff); /* 23:16 */
418 ATA_OUT8(ATA_SELECT
, SELECT_LBA
| ata_device
);
421 ATA_OUT8(ATA_COMMAND
, usedma
? CMD_WRITE_DMA_EXT
: CMD_WRITE_MULTIPLE_EXT
);
423 ATA_OUT8(ATA_COMMAND
, usedma
? CMD_READ_DMA_EXT
: CMD_READ_MULTIPLE_EXT
);
425 ATA_OUT8(ATA_COMMAND
, write
? CMD_WRITE_MULTIPLE_EXT
: CMD_READ_MULTIPLE_EXT
);
431 ATA_OUT8(ATA_NSECTOR
, count
& 0xff); /* 0 means 256 sectors */
432 ATA_OUT8(ATA_SECTOR
, start
& 0xff);
433 ATA_OUT8(ATA_LCYL
, (start
>> 8) & 0xff);
434 ATA_OUT8(ATA_HCYL
, (start
>> 16) & 0xff);
435 ATA_OUT8(ATA_SELECT
, ((start
>> 24) & 0xf) | SELECT_LBA
| ata_device
);
438 ATA_OUT8(ATA_COMMAND
, usedma
? CMD_WRITE_DMA
: CMD_WRITE_MULTIPLE
);
440 ATA_OUT8(ATA_COMMAND
, usedma
? CMD_READ_DMA
: CMD_READ_MULTIPLE
);
442 ATA_OUT8(ATA_COMMAND
, write
? CMD_WRITE_MULTIPLE
: CMD_READ_MULTIPLE
);
446 /* wait at least 400ns between writing command and reading status */
447 __asm__
volatile ("nop");
448 __asm__
volatile ("nop");
449 __asm__
volatile ("nop");
450 __asm__
volatile ("nop");
451 __asm__
volatile ("nop");
455 if (!ata_dma_finish())
459 perform_soft_reset();
464 spinup_time
= current_tick
- spinup_start
;
470 #endif /* HAVE_ATA_DMA */
478 if (!wait_for_start_of_transfer()) {
479 /* We have timed out waiting for RDY and/or DRQ, possibly
480 because the hard drive is shaking and has problems
481 reading the data. We have two options:
483 2) Perform a soft reset and try again.
485 We choose alternative 2.
487 perform_soft_reset();
493 spinup_time
= current_tick
- spinup_start
;
498 /* read the status register exactly once per loop */
499 status
= ATA_IN8(ATA_STATUS
);
500 error
= ATA_IN8(ATA_ERROR
);
502 if (count
>= multisectors
)
503 sectors
= multisectors
;
507 wordcount
= sectors
* SECTOR_SIZE
/ 2;
510 copy_write_sectors(buf
, wordcount
);
512 copy_read_sectors(buf
, wordcount
);
515 "Device errors encountered during READ MULTIPLE commands
516 are posted at the beginning of the block or partial block
517 transfer, but the DRQ bit is still set to one and the data
518 transfer shall take place, including transfer of corrupted
522 if ( status
& (STATUS_BSY
| STATUS_ERR
| STATUS_DF
) ) {
523 perform_soft_reset();
525 /* no point retrying IDNF, sector no. was invalid */
526 if (error
& ERROR_IDNF
)
531 buf
+= sectors
* SECTOR_SIZE
; /* Advance one chunk of sectors */
534 last_disk_activity
= current_tick
;
538 if(!ret
&& !wait_for_end_of_transfer()) {
541 error
= ATA_IN8(ATA_ERROR
);
542 perform_soft_reset();
544 /* no point retrying IDNF, sector no. was invalid */
545 if (error
& ERROR_IDNF
)
554 #ifndef MAX_PHYS_SECTOR_SIZE
555 mutex_unlock(&ata_mtx
);
561 #ifndef MAX_PHYS_SECTOR_SIZE
562 int ata_read_sectors(IF_MD2(int drive
,)
567 #ifdef HAVE_MULTIDRIVE
568 (void)drive
; /* unused for now */
571 return ata_transfer_sectors(start
, incount
, inbuf
, false);
575 #ifndef MAX_PHYS_SECTOR_SIZE
576 int ata_write_sectors(IF_MD2(int drive
,)
581 #ifdef HAVE_MULTIDRIVE
582 (void)drive
; /* unused for now */
585 return ata_transfer_sectors(start
, count
, (void*)buf
, true);
589 #ifdef MAX_PHYS_SECTOR_SIZE
590 static int cache_sector(unsigned long sector
)
594 sector
&= ~(phys_sector_mult
- 1);
595 /* round down to physical sector boundary */
597 /* check whether the sector is already cached */
598 if (sector_cache
.inuse
&& (sector_cache
.sectornum
== sector
))
601 /* not found: read the sector */
602 sector_cache
.inuse
= false;
603 rc
= ata_transfer_sectors(sector
, phys_sector_mult
, sector_cache
.data
, false);
606 sector_cache
.sectornum
= sector
;
607 sector_cache
.inuse
= true;
612 static inline int flush_current_sector(void)
614 return ata_transfer_sectors(sector_cache
.sectornum
, phys_sector_mult
,
615 sector_cache
.data
, true);
618 int ata_read_sectors(IF_MD2(int drive
,)
626 #ifdef HAVE_MULTIDRIVE
627 (void)drive
; /* unused for now */
629 mutex_lock(&ata_mtx
);
631 offset
= start
& (phys_sector_mult
- 1);
633 if (offset
) /* first partial sector */
635 int partcount
= MIN(incount
, phys_sector_mult
- offset
);
637 rc
= cache_sector(start
);
643 memcpy(inbuf
, sector_cache
.data
+ offset
* SECTOR_SIZE
,
644 partcount
* SECTOR_SIZE
);
647 inbuf
+= partcount
* SECTOR_SIZE
;
648 incount
-= partcount
;
652 offset
= incount
& (phys_sector_mult
- 1);
657 rc
= ata_transfer_sectors(start
, incount
, inbuf
, false);
664 inbuf
+= incount
* SECTOR_SIZE
;
668 rc
= cache_sector(start
);
674 memcpy(inbuf
, sector_cache
.data
, offset
* SECTOR_SIZE
);
679 mutex_unlock(&ata_mtx
);
684 int ata_write_sectors(IF_MD2(int drive
,)
692 #ifdef HAVE_MULTIDRIVE
693 (void)drive
; /* unused for now */
695 mutex_lock(&ata_mtx
);
697 offset
= start
& (phys_sector_mult
- 1);
699 if (offset
) /* first partial sector */
701 int partcount
= MIN(count
, phys_sector_mult
- offset
);
703 rc
= cache_sector(start
);
709 memcpy(sector_cache
.data
+ offset
* SECTOR_SIZE
, buf
,
710 partcount
* SECTOR_SIZE
);
711 rc
= flush_current_sector();
718 buf
+= partcount
* SECTOR_SIZE
;
723 offset
= count
& (phys_sector_mult
- 1);
728 rc
= ata_transfer_sectors(start
, count
, (void*)buf
, true);
735 buf
+= count
* SECTOR_SIZE
;
739 rc
= cache_sector(start
);
745 memcpy(sector_cache
.data
, buf
, offset
* SECTOR_SIZE
);
746 rc
= flush_current_sector();
756 mutex_unlock(&ata_mtx
);
760 #endif /* MAX_PHYS_SECTOR_SIZE */
762 static int check_registers(void)
766 if (ATA_IN8(ATA_STATUS
) & STATUS_BSY
)
769 for (i
= 0; i
<64; i
++) {
770 ATA_OUT8(ATA_NSECTOR
, TEST_PATTERN1
);
771 ATA_OUT8(ATA_SECTOR
, TEST_PATTERN2
);
772 ATA_OUT8(ATA_LCYL
, TEST_PATTERN3
);
773 ATA_OUT8(ATA_HCYL
, TEST_PATTERN4
);
775 if (((ATA_IN8(ATA_NSECTOR
) & 0xff) == TEST_PATTERN1
) &&
776 ((ATA_IN8(ATA_SECTOR
) & 0xff) == TEST_PATTERN2
) &&
777 ((ATA_IN8(ATA_LCYL
) & 0xff) == TEST_PATTERN3
) &&
778 ((ATA_IN8(ATA_HCYL
) & 0xff) == TEST_PATTERN4
))
786 static int freeze_lock(void)
788 /* does the disk support Security Mode feature set? */
789 if (identify_info
[82] & 2)
791 ATA_OUT8(ATA_SELECT
, ata_device
);
796 ATA_OUT8(ATA_COMMAND
, CMD_SECURITY_FREEZE_LOCK
);
805 void ata_spindown(int seconds
)
807 sleep_timeout
= seconds
* HZ
;
810 bool ata_disk_is_active(void)
815 static int ata_perform_sleep(void)
817 /* guard against calls made with checks of these variables outside
818 the mutex that may not be on the ata thread; status may have changed. */
819 if (spinup
|| sleeping
) {
823 ATA_OUT8(ATA_SELECT
, ata_device
);
825 if(!wait_for_rdy()) {
826 DEBUGF("ata_perform_sleep() - not RDY\n");
830 ATA_OUT8(ATA_COMMAND
, CMD_SLEEP
);
834 DEBUGF("ata_perform_sleep() - CMD failed\n");
844 queue_post(&ata_queue
, Q_SLEEP
, 0);
847 void ata_sleepnow(void)
849 if (!spinup
&& !sleeping
&& initialized
)
851 call_storage_idle_notifys(false);
852 mutex_lock(&ata_mtx
);
854 mutex_unlock(&ata_mtx
);
860 last_user_activity
= current_tick
;
863 static void ata_thread(void)
865 static long last_sleep
= 0;
866 struct queue_event ev
;
867 #ifdef ALLOW_USB_SPINDOWN
868 static bool usb_mode
= false;
872 queue_wait_w_tmo(&ata_queue
, &ev
, HZ
/2);
876 if (!spinup
&& !sleeping
)
878 if (TIME_AFTER( current_tick
,
879 last_disk_activity
+ (HZ
*2) ) )
881 #ifdef ALLOW_USB_SPINDOWN
885 call_storage_idle_notifys(false);
889 if ( sleep_timeout
&&
890 TIME_AFTER( current_tick
,
891 last_user_activity
+ sleep_timeout
) &&
892 TIME_AFTER( current_tick
,
893 last_disk_activity
+ sleep_timeout
) )
895 #ifdef ALLOW_USB_SPINDOWN
899 call_storage_idle_notifys(true);
901 mutex_lock(&ata_mtx
);
903 last_sleep
= current_tick
;
904 mutex_unlock(&ata_mtx
);
908 #ifdef HAVE_ATA_POWER_OFF
909 if ( !spinup
&& sleeping
&& !poweroff
&&
910 TIME_AFTER( current_tick
, last_sleep
+ ATA_POWER_OFF_TIMEOUT
))
912 mutex_lock(&ata_mtx
);
913 ide_power_enable(false);
915 mutex_unlock(&ata_mtx
);
921 case SYS_USB_CONNECTED
:
922 /* Tell the USB thread that we are safe */
923 DEBUGF("ata_thread got SYS_USB_CONNECTED\n");
924 #ifdef ALLOW_USB_SPINDOWN
926 usb_acknowledge(SYS_USB_CONNECTED_ACK
);
927 /* There is no need to force ATA power on */
929 mutex_lock(&ata_mtx
);
932 sleeping
= false; /* set this now since it'll be on */
939 perform_soft_reset();
944 mutex_unlock(&ata_mtx
);
946 /* Wait until the USB cable is extracted again */
947 usb_acknowledge(SYS_USB_CONNECTED_ACK
);
948 usb_wait_for_disconnect(&ata_queue
);
952 #ifdef ALLOW_USB_SPINDOWN
953 case SYS_USB_DISCONNECTED
:
954 /* Tell the USB thread that we are ready again */
955 DEBUGF("ata_thread got SYS_USB_DISCONNECTED\n");
959 #endif /* USB_NONE */
962 #ifdef ALLOW_USB_SPINDOWN
966 call_storage_idle_notifys(false);
968 last_disk_activity
= current_tick
- sleep_timeout
+ (HZ
/2);
971 #ifdef ATA_DRIVER_CLOSE
979 /* Hardware reset protocol as specified in chapter 9.1, ATA spec draft v5 */
980 static int ata_hard_reset(void)
984 mutex_lock(&ata_mtx
);
989 ATA_OUT8(ATA_SELECT
, ata_device
); /* select the right device */
990 ret
= wait_for_bsy();
992 /* Massage the return code so it is 0 on success and -1 on failure */
995 mutex_unlock(&ata_mtx
);
1000 static int perform_soft_reset(void)
1002 /* If this code is allowed to run on a Nano, the next reads from the flash will
1003 * time out, so we disable it. It shouldn't be necessary anyway, since the
1004 * ATA -> Flash interface automatically sleeps almost immediately after the
1010 ATA_OUT8(ATA_SELECT
, SELECT_LBA
| ata_device
);
1011 ATA_OUT8(ATA_CONTROL
, CONTROL_nIEN
|CONTROL_SRST
);
1012 sleep(1); /* >= 5us */
1015 /* DMA requires INTRQ be enabled */
1016 ATA_OUT8(ATA_CONTROL
, 0);
1018 ATA_OUT8(ATA_CONTROL
, CONTROL_nIEN
);
1020 sleep(1); /* >2ms */
1022 /* This little sucker can take up to 30 seconds */
1026 ret
= wait_for_rdy();
1027 } while(!ret
&& retry_count
--);
1035 if (set_multiple_mode(multisectors
))
1044 int ata_soft_reset(void)
1048 mutex_lock(&ata_mtx
);
1050 ret
= perform_soft_reset();
1052 mutex_unlock(&ata_mtx
);
1056 static int ata_power_on(void)
1060 ide_power_enable(true);
1061 sleep(HZ
/4); /* allow voltage to build up */
1063 /* Accessing the PP IDE controller too early after powering up the disk
1064 * makes the core hang for a short time, causing an audio dropout. This
1065 * also depends on the disk; iPod Mini G2 needs at least HZ/5 to get rid
1066 * of the dropout. Since this time isn't additive (the wait_for_bsy() in
1067 * ata_hard_reset() will shortened by the same amount), it's a good idea
1068 * to do this on all HDD based targets. */
1070 if( ata_hard_reset() )
1073 rc
= set_features();
1077 if (set_multiple_mode(multisectors
))
1086 static int master_slave_detect(void)
1089 ATA_OUT8(ATA_SELECT
, 0);
1090 if (ATA_IN8(ATA_STATUS
) & (STATUS_RDY
|STATUS_BSY
)) {
1092 DEBUGF("Found master harddisk\n");
1096 ATA_OUT8(ATA_SELECT
, SELECT_DEVICE1
);
1097 if (ATA_IN8(ATA_STATUS
) & (STATUS_RDY
|STATUS_BSY
)) {
1098 ata_device
= SELECT_DEVICE1
;
1099 DEBUGF("Found slave harddisk\n");
1107 static int identify(void)
1111 ATA_OUT8(ATA_SELECT
, ata_device
);
1113 if(!wait_for_rdy()) {
1114 DEBUGF("identify() - not RDY\n");
1117 ATA_OUT8(ATA_COMMAND
, CMD_IDENTIFY
);
1119 if (!wait_for_start_of_transfer())
1121 DEBUGF("identify() - CMD failed\n");
1125 for (i
=0; i
<SECTOR_SIZE
/2; i
++) {
1126 /* the IDENTIFY words are already swapped, so we need to treat
1127 this info differently that normal sector data */
1128 identify_info
[i
] = ATA_SWAP_IDENTIFY(ATA_IN16(ATA_DATA
));
1134 static int set_multiple_mode(int sectors
)
1136 ATA_OUT8(ATA_SELECT
, ata_device
);
1138 if(!wait_for_rdy()) {
1139 DEBUGF("set_multiple_mode() - not RDY\n");
1143 ATA_OUT8(ATA_NSECTOR
, sectors
);
1144 ATA_OUT8(ATA_COMMAND
, CMD_SET_MULTIPLE_MODE
);
1146 if (!wait_for_rdy())
1148 DEBUGF("set_multiple_mode() - CMD failed\n");
1156 static int get_best_mode(unsigned short identword
, int max
, int modetype
)
1158 unsigned short testbit
= BIT_N(max
);
1161 if (identword
& testbit
)
1162 return max
| modetype
;
1171 static int set_features(void)
1174 unsigned char id_word
;
1175 unsigned char id_bit
;
1176 unsigned char subcommand
;
1177 unsigned char parameter
;
1179 { 83, 14, 0x03, 0 }, /* force PIO mode */
1180 { 83, 3, 0x05, 0x80 }, /* adv. power management: lowest w/o standby */
1181 { 83, 9, 0x42, 0x80 }, /* acoustic management: lowest noise */
1182 { 82, 6, 0xaa, 0 }, /* enable read look-ahead */
1184 { 0, 0, 0x03, 0 }, /* DMA mode */
1190 /* Find out the highest supported PIO mode */
1191 if(identify_info
[64] & 2)
1194 if(identify_info
[64] & 1)
1197 /* Update the table: set highest supported pio mode that we also support */
1198 features
[0].parameter
= 8 + pio_mode
;
1201 if (identify_info
[53] & (1<<2))
1202 /* Ultra DMA mode info present, find a mode */
1203 dma_mode
= get_best_mode(identify_info
[88], ATA_MAX_UDMA
, 0x40);
1206 /* No UDMA mode found, try to find a multi-word DMA mode */
1207 dma_mode
= get_best_mode(identify_info
[63], ATA_MAX_MWDMA
, 0x20);
1208 features
[4].id_word
= 63;
1211 features
[4].id_word
= 88;
1213 features
[4].id_bit
= dma_mode
& 7;
1214 features
[4].parameter
= dma_mode
;
1215 #endif /* HAVE_ATA_DMA */
1217 ATA_OUT8(ATA_SELECT
, ata_device
);
1219 if (!wait_for_rdy()) {
1220 DEBUGF("set_features() - not RDY\n");
1224 for (i
=0; i
< (int)(sizeof(features
)/sizeof(features
[0])); i
++) {
1225 if (identify_info
[features
[i
].id_word
] & BIT_N(features
[i
].id_bit
)) {
1226 ATA_OUT8(ATA_FEATURE
, features
[i
].subcommand
);
1227 ATA_OUT8(ATA_NSECTOR
, features
[i
].parameter
);
1228 ATA_OUT8(ATA_COMMAND
, CMD_SET_FEATURES
);
1230 if (!wait_for_rdy()) {
1231 DEBUGF("set_features() - CMD failed\n");
1235 if((ATA_IN8(ATA_ALT_STATUS
) & STATUS_ERR
) && (i
!= 1)) {
1236 /* some CF cards don't like advanced powermanagement
1237 even if they mark it as supported - go figure... */
1238 if(ATA_IN8(ATA_ERROR
) & ERROR_ABRT
) {
1245 #ifdef ATA_SET_DEVICE_FEATURES
1246 ata_set_pio_timings(pio_mode
);
1250 ata_dma_set_mode(dma_mode
);
1256 unsigned short* ata_get_identify(void)
1258 return identify_info
;
1261 static int init_and_check(bool hard_reset
)
1267 /* This should reset both master and slave, we don't yet know what's in */
1269 if (ata_hard_reset())
1273 rc
= master_slave_detect();
1277 /* symptom fix: else check_registers() below may fail */
1278 if (hard_reset
&& !wait_for_bsy())
1281 rc
= check_registers();
1293 if ( !initialized
) {
1294 mutex_init(&ata_mtx
);
1295 queue_init(&ata_queue
, true);
1298 mutex_lock(&ata_mtx
);
1300 /* must be called before ata_device_init() */
1301 coldstart
= ata_is_coldstart();
1306 #ifdef MAX_PHYS_SECTOR_SIZE
1307 memset(§or_cache
, 0, sizeof(sector_cache
));
1310 if ( !initialized
) {
1311 /* First call won't have multiple thread contention - this
1312 * may return at any point without having to unlock */
1313 mutex_unlock(&ata_mtx
);
1315 if (!ide_powered()) /* somebody has switched it off */
1317 ide_power_enable(true);
1318 sleep(HZ
/4); /* allow voltage to build up */
1322 /* DMA requires INTRQ be enabled */
1323 ATA_OUT8(ATA_CONTROL
, 0);
1326 /* first try, hard reset at cold start only */
1327 rc
= init_and_check(coldstart
);
1330 { /* failed? -> second try, always with hard reset */
1331 DEBUGF("ata: init failed, retrying...\n");
1332 rc
= init_and_check(true);
1342 multisectors
= identify_info
[47] & 0xff;
1343 if (multisectors
== 0) /* Invalid multisector info, try with 16 */
1346 DEBUGF("ata: %d sectors per ata request\n",multisectors
);
1348 total_sectors
= identify_info
[60] | (identify_info
[61] << 16);
1351 if (identify_info
[83] & 0x0400 /* 48 bit address support */
1352 && total_sectors
== 0x0FFFFFFF) /* and disk size >= 128 GiB */
1353 { /* (needs BigLBA addressing) */
1354 if (identify_info
[102] || identify_info
[103])
1355 panicf("Unsupported disk size: >= 2^32 sectors");
1357 total_sectors
= identify_info
[100] | (identify_info
[101] << 16);
1358 lba48
= true; /* use BigLBA */
1366 rc
= set_features();
1370 #ifdef MAX_PHYS_SECTOR_SIZE
1371 /* Find out the physical sector size */
1372 if((identify_info
[106] & 0xe000) == 0x6000)
1373 phys_sector_mult
= BIT_N(identify_info
[106] & 0x000f);
1375 phys_sector_mult
= 1;
1377 DEBUGF("ata: %d logical sectors per phys sector", phys_sector_mult
);
1379 if (phys_sector_mult
> 1)
1381 /* Check if drive really needs emulation - if we can access
1382 * sector 1 then assume the drive will handle it better than
1383 * us, and ignore the large physical sectors.
1385 char throwaway
[SECTOR_SIZE
];
1386 rc
= ata_transfer_sectors(1, 1, &throwaway
, false);
1388 phys_sector_mult
= 1;
1391 if (phys_sector_mult
> (MAX_PHYS_SECTOR_SIZE
/SECTOR_SIZE
))
1392 panicf("Unsupported physical sector size: %d",
1393 phys_sector_mult
* SECTOR_SIZE
);
1396 mutex_lock(&ata_mtx
); /* Balance unlock below */
1398 last_disk_activity
= current_tick
;
1399 #ifdef ATA_DRIVER_CLOSE
1402 create_thread(ata_thread
, ata_stack
,
1403 sizeof(ata_stack
), 0, ata_thread_name
1404 IF_PRIO(, PRIORITY_USER_INTERFACE
)
1409 rc
= set_multiple_mode(multisectors
);
1413 mutex_unlock(&ata_mtx
);
1417 #ifdef ATA_DRIVER_CLOSE
1418 void ata_close(void)
1420 unsigned int thread_id
= ata_thread_id
;
1427 queue_post(&ata_queue
, Q_CLOSE
, 0);
1428 thread_wait(thread_id
);
1430 #endif /* ATA_DRIVER_CLOSE */
1432 #if (CONFIG_LED == LED_REAL)
1433 void ata_set_led_enabled(bool enabled
)
1435 ata_led_enabled
= enabled
;
1436 if (ata_led_enabled
)
1443 long ata_last_disk_activity(void)
1445 return last_disk_activity
;
1448 int ata_spinup_time(void)
1453 #ifdef STORAGE_GET_INFO
1454 void ata_get_info(IF_MD2(int drive
,)struct storage_info
*info
)
1456 unsigned short *src
,*dest
;
1457 static char vendor
[8];
1458 static char product
[16];
1459 static char revision
[4];
1460 #ifdef HAVE_MULTIDRIVE
1461 (void)drive
; /* unused for now */
1464 info
->sector_size
= SECTOR_SIZE
;
1465 info
->num_sectors
= total_sectors
;
1467 src
= (unsigned short*)&identify_info
[27];
1468 dest
= (unsigned short*)vendor
;
1470 dest
[i
] = htobe16(src
[i
]);
1471 info
->vendor
=vendor
;
1473 src
= (unsigned short*)&identify_info
[31];
1474 dest
= (unsigned short*)product
;
1476 dest
[i
] = htobe16(src
[i
]);
1477 info
->product
=product
;
1479 src
= (unsigned short*)&identify_info
[23];
1480 dest
= (unsigned short*)revision
;
1482 dest
[i
] = htobe16(src
[i
]);
1483 info
->revision
=revision
;
1488 /* Returns last DMA mode as set by set_features() */
1489 int ata_get_dma_mode(void)
1494 /* Needed to allow updating while waiting for DMA to complete */
1495 void ata_keep_active(void)
1497 last_disk_activity
= current_tick
;
1501 #ifdef CONFIG_STORAGE_MULTI
1502 int ata_num_drives(int first_drive
)
1504 /* We don't care which logical drive number(s) we have been assigned */