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-driver.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
= thread_self_entry();
104 if (current
== l
->thread
)
110 corelock_lock(&l
->cl
);
112 IF_PRIO( current
->skip_count
= -1; )
114 while (l
->locked
!= 0)
116 corelock_unlock(&l
->cl
);
118 corelock_lock(&l
->cl
);
123 corelock_unlock(&l
->cl
);
126 static void ata_lock_unlock(struct ata_lock
*l
)
134 corelock_lock(&l
->cl
);
136 IF_PRIO( l
->thread
->skip_count
= 0; )
141 corelock_unlock(&l
->cl
);
144 #define mutex ata_lock
145 #define mutex_init ata_lock_init
146 #define mutex_lock ata_lock_lock
147 #define mutex_unlock ata_lock_unlock
148 #endif /* MAX_PHYS_SECTOR_SIZE */
150 #if defined(HAVE_USBSTACK) && defined(USE_ROCKBOX_USB)
151 #define ALLOW_USB_SPINDOWN
154 static struct mutex ata_mtx SHAREDBSS_ATTR
;
155 static int ata_device
; /* device 0 (master) or 1 (slave) */
157 static int spinup_time
= 0;
158 #if (CONFIG_LED == LED_REAL)
159 static bool ata_led_enabled
= true;
160 static bool ata_led_on
= false;
162 static bool spinup
= false;
163 static bool sleeping
= true;
164 #ifdef HAVE_ATA_POWER_OFF
165 static bool poweroff
= false;
167 static long sleep_timeout
= 5*HZ
;
169 static bool lba48
= false; /* set for 48 bit addressing */
171 static long ata_stack
[(DEFAULT_STACK_SIZE
*3)/sizeof(long)];
172 static const char ata_thread_name
[] = "ata";
173 static struct event_queue ata_queue SHAREDBSS_ATTR
;
174 static bool initialized
= false;
176 static long last_user_activity
= -1;
177 static long last_disk_activity
= -1;
179 static unsigned long total_sectors
;
180 static int multisectors
; /* number of supported multisectors */
181 static unsigned short identify_info
[SECTOR_SIZE
/2];
183 #ifdef MAX_PHYS_SECTOR_SIZE
185 struct sector_cache_entry
{
187 unsigned long sectornum
; /* logical sector */
188 unsigned char data
[MAX_PHYS_SECTOR_SIZE
];
190 /* buffer for reading and writing large physical sectors */
192 static struct sector_cache_entry sector_cache
;
193 static int phys_sector_mult
= 1;
197 static int dma_mode
= 0;
200 #ifdef HAVE_ATA_POWER_OFF
201 static int ata_power_on(void);
203 static int perform_soft_reset(void);
204 static int set_multiple_mode(int sectors
);
205 static int set_features(void);
207 #ifndef ATA_TARGET_POLLING
208 STATICIRAM ICODE_ATTR
int wait_for_bsy(void)
210 long timeout
= current_tick
+ HZ
*30;
214 if (!(ATA_IN8(ATA_STATUS
) & STATUS_BSY
))
216 last_disk_activity
= current_tick
;
218 } while (TIME_BEFORE(current_tick
, timeout
));
220 return 0; /* timeout */
223 STATICIRAM ICODE_ATTR
int wait_for_rdy(void)
230 timeout
= current_tick
+ HZ
*10;
234 if (ATA_IN8(ATA_ALT_STATUS
) & STATUS_RDY
)
236 last_disk_activity
= current_tick
;
238 } while (TIME_BEFORE(current_tick
, timeout
));
240 return 0; /* timeout */
243 #define wait_for_bsy ata_wait_for_bsy
244 #define wait_for_rdy ata_wait_for_rdy
247 STATICIRAM ICODE_ATTR
int wait_for_start_of_transfer(void)
252 return (ATA_IN8(ATA_ALT_STATUS
) & (STATUS_BSY
|STATUS_DRQ
)) == STATUS_DRQ
;
255 STATICIRAM ICODE_ATTR
int wait_for_end_of_transfer(void)
259 return (ATA_IN8(ATA_ALT_STATUS
) &
260 (STATUS_BSY
|STATUS_RDY
|STATUS_DF
|STATUS_DRQ
|STATUS_ERR
))
264 #if (CONFIG_LED == LED_REAL)
265 /* Conditionally block LED access for the ATA driver, so the LED can be
266 * (mis)used for other purposes */
267 static void ata_led(bool on
)
274 #define ata_led(on) led(on)
277 #ifndef ATA_OPTIMIZED_READING
278 STATICIRAM ICODE_ATTR
void copy_read_sectors(unsigned char* buf
, int wordcount
)
280 unsigned short tmp
= 0;
282 if ( (unsigned long)buf
& 1)
283 { /* not 16-bit aligned, copy byte by byte */
284 unsigned char* bufend
= buf
+ wordcount
*2;
287 tmp
= ATA_IN16(ATA_DATA
);
288 #if defined(ROCKBOX_LITTLE_ENDIAN)
289 *buf
++ = tmp
& 0xff; /* I assume big endian */
290 *buf
++ = tmp
>> 8; /* and don't use the SWAB16 macro */
295 } while (buf
< bufend
); /* tail loop is faster */
298 { /* 16-bit aligned, can do faster copy */
299 unsigned short* wbuf
= (unsigned short*)buf
;
300 unsigned short* wbufend
= wbuf
+ wordcount
;
303 *wbuf
= ATA_IN16(ATA_DATA
);
304 } while (++wbuf
< wbufend
); /* tail loop is faster */
307 #endif /* !ATA_OPTIMIZED_READING */
309 #ifndef ATA_OPTIMIZED_WRITING
310 STATICIRAM ICODE_ATTR
void copy_write_sectors(const unsigned char* buf
,
313 if ( (unsigned long)buf
& 1)
314 { /* not 16-bit aligned, copy byte by byte */
315 unsigned short tmp
= 0;
316 const unsigned char* bufend
= buf
+ wordcount
*2;
319 #if defined(ROCKBOX_LITTLE_ENDIAN)
320 tmp
= (unsigned short) *buf
++;
321 tmp
|= (unsigned short) *buf
++ << 8;
323 tmp
= (unsigned short) *buf
++ << 8;
324 tmp
|= (unsigned short) *buf
++;
326 ATA_OUT16(ATA_DATA
, tmp
);
327 } while (buf
< bufend
); /* tail loop is faster */
330 { /* 16-bit aligned, can do faster copy */
331 unsigned short* wbuf
= (unsigned short*)buf
;
332 unsigned short* wbufend
= wbuf
+ wordcount
;
335 ATA_OUT16(ATA_DATA
, *wbuf
);
336 } while (++wbuf
< wbufend
); /* tail loop is faster */
339 #endif /* !ATA_OPTIMIZED_WRITING */
341 static int ata_transfer_sectors(unsigned long start
,
355 #ifndef MAX_PHYS_SECTOR_SIZE
356 mutex_lock(&ata_mtx
);
359 if (start
+ incount
> total_sectors
) {
364 last_disk_activity
= current_tick
;
365 spinup_start
= current_tick
;
370 sleeping
= false; /* set this now since it'll be on */
372 #ifdef HAVE_ATA_POWER_OFF
374 if (ata_power_on()) {
382 if (perform_soft_reset()) {
389 timeout
= current_tick
+ READWRITE_TIMEOUT
;
391 ATA_OUT8(ATA_SELECT
, ata_device
);
401 while (TIME_BEFORE(current_tick
, timeout
)) {
403 last_disk_activity
= current_tick
;
406 /* If DMA is supported and parameters are ok for DMA, use it */
407 if (dma_mode
&& ata_dma_setup(inbuf
, incount
* SECTOR_SIZE
, write
))
414 ATA_OUT8(ATA_NSECTOR
, count
>> 8);
415 ATA_OUT8(ATA_NSECTOR
, count
& 0xff);
416 ATA_OUT8(ATA_SECTOR
, (start
>> 24) & 0xff); /* 31:24 */
417 ATA_OUT8(ATA_SECTOR
, start
& 0xff); /* 7:0 */
418 ATA_OUT8(ATA_LCYL
, 0); /* 39:32 */
419 ATA_OUT8(ATA_LCYL
, (start
>> 8) & 0xff); /* 15:8 */
420 ATA_OUT8(ATA_HCYL
, 0); /* 47:40 */
421 ATA_OUT8(ATA_HCYL
, (start
>> 16) & 0xff); /* 23:16 */
422 ATA_OUT8(ATA_SELECT
, SELECT_LBA
| ata_device
);
425 ATA_OUT8(ATA_COMMAND
, usedma
? CMD_WRITE_DMA_EXT
: CMD_WRITE_MULTIPLE_EXT
);
427 ATA_OUT8(ATA_COMMAND
, usedma
? CMD_READ_DMA_EXT
: CMD_READ_MULTIPLE_EXT
);
429 ATA_OUT8(ATA_COMMAND
, write
? CMD_WRITE_MULTIPLE_EXT
: CMD_READ_MULTIPLE_EXT
);
435 ATA_OUT8(ATA_NSECTOR
, count
& 0xff); /* 0 means 256 sectors */
436 ATA_OUT8(ATA_SECTOR
, start
& 0xff);
437 ATA_OUT8(ATA_LCYL
, (start
>> 8) & 0xff);
438 ATA_OUT8(ATA_HCYL
, (start
>> 16) & 0xff);
439 ATA_OUT8(ATA_SELECT
, ((start
>> 24) & 0xf) | SELECT_LBA
| ata_device
);
442 ATA_OUT8(ATA_COMMAND
, usedma
? CMD_WRITE_DMA
: CMD_WRITE_MULTIPLE
);
444 ATA_OUT8(ATA_COMMAND
, usedma
? CMD_READ_DMA
: CMD_READ_MULTIPLE
);
446 ATA_OUT8(ATA_COMMAND
, write
? CMD_WRITE_MULTIPLE
: CMD_READ_MULTIPLE
);
450 /* wait at least 400ns between writing command and reading status */
451 __asm__
volatile ("nop");
452 __asm__
volatile ("nop");
453 __asm__
volatile ("nop");
454 __asm__
volatile ("nop");
455 __asm__
volatile ("nop");
459 if (!ata_dma_finish())
463 perform_soft_reset();
468 spinup_time
= current_tick
- spinup_start
;
470 #ifdef HAVE_ATA_POWER_OFF
476 #endif /* HAVE_ATA_DMA */
484 if (!wait_for_start_of_transfer()) {
485 /* We have timed out waiting for RDY and/or DRQ, possibly
486 because the hard drive is shaking and has problems
487 reading the data. We have two options:
489 2) Perform a soft reset and try again.
491 We choose alternative 2.
493 perform_soft_reset();
499 spinup_time
= current_tick
- spinup_start
;
501 #ifdef HAVE_ATA_POWER_OFF
506 /* read the status register exactly once per loop */
507 status
= ATA_IN8(ATA_STATUS
);
508 error
= ATA_IN8(ATA_ERROR
);
510 if (count
>= multisectors
)
511 sectors
= multisectors
;
515 wordcount
= sectors
* SECTOR_SIZE
/ 2;
518 copy_write_sectors(buf
, wordcount
);
520 copy_read_sectors(buf
, wordcount
);
523 "Device errors encountered during READ MULTIPLE commands
524 are posted at the beginning of the block or partial block
525 transfer, but the DRQ bit is still set to one and the data
526 transfer shall take place, including transfer of corrupted
530 if ( status
& (STATUS_BSY
| STATUS_ERR
| STATUS_DF
) ) {
531 perform_soft_reset();
533 /* no point retrying IDNF, sector no. was invalid */
534 if (error
& ERROR_IDNF
)
539 buf
+= sectors
* SECTOR_SIZE
; /* Advance one chunk of sectors */
542 last_disk_activity
= current_tick
;
546 if(!ret
&& !wait_for_end_of_transfer()) {
549 error
= ATA_IN8(ATA_ERROR
);
550 perform_soft_reset();
552 /* no point retrying IDNF, sector no. was invalid */
553 if (error
& ERROR_IDNF
)
562 #ifndef MAX_PHYS_SECTOR_SIZE
563 mutex_unlock(&ata_mtx
);
569 #ifndef MAX_PHYS_SECTOR_SIZE
570 int ata_read_sectors(IF_MD2(int drive
,)
575 #ifdef HAVE_MULTIDRIVE
576 (void)drive
; /* unused for now */
579 return ata_transfer_sectors(start
, incount
, inbuf
, false);
583 #ifndef MAX_PHYS_SECTOR_SIZE
584 int ata_write_sectors(IF_MD2(int drive
,)
589 #ifdef HAVE_MULTIDRIVE
590 (void)drive
; /* unused for now */
593 return ata_transfer_sectors(start
, count
, (void*)buf
, true);
597 #ifdef MAX_PHYS_SECTOR_SIZE
598 static int cache_sector(unsigned long sector
)
602 sector
&= ~(phys_sector_mult
- 1);
603 /* round down to physical sector boundary */
605 /* check whether the sector is already cached */
606 if (sector_cache
.inuse
&& (sector_cache
.sectornum
== sector
))
609 /* not found: read the sector */
610 sector_cache
.inuse
= false;
611 rc
= ata_transfer_sectors(sector
, phys_sector_mult
, sector_cache
.data
, false);
614 sector_cache
.sectornum
= sector
;
615 sector_cache
.inuse
= true;
620 static inline int flush_current_sector(void)
622 return ata_transfer_sectors(sector_cache
.sectornum
, phys_sector_mult
,
623 sector_cache
.data
, true);
626 int ata_read_sectors(IF_MD2(int drive
,)
634 #ifdef HAVE_MULTIDRIVE
635 (void)drive
; /* unused for now */
637 mutex_lock(&ata_mtx
);
639 offset
= start
& (phys_sector_mult
- 1);
641 if (offset
) /* first partial sector */
643 int partcount
= MIN(incount
, phys_sector_mult
- offset
);
645 rc
= cache_sector(start
);
651 memcpy(inbuf
, sector_cache
.data
+ offset
* SECTOR_SIZE
,
652 partcount
* SECTOR_SIZE
);
655 inbuf
+= partcount
* SECTOR_SIZE
;
656 incount
-= partcount
;
660 offset
= incount
& (phys_sector_mult
- 1);
665 rc
= ata_transfer_sectors(start
, incount
, inbuf
, false);
672 inbuf
+= incount
* SECTOR_SIZE
;
676 rc
= cache_sector(start
);
682 memcpy(inbuf
, sector_cache
.data
, offset
* SECTOR_SIZE
);
687 mutex_unlock(&ata_mtx
);
692 int ata_write_sectors(IF_MD2(int drive
,)
700 #ifdef HAVE_MULTIDRIVE
701 (void)drive
; /* unused for now */
703 mutex_lock(&ata_mtx
);
705 offset
= start
& (phys_sector_mult
- 1);
707 if (offset
) /* first partial sector */
709 int partcount
= MIN(count
, phys_sector_mult
- offset
);
711 rc
= cache_sector(start
);
717 memcpy(sector_cache
.data
+ offset
* SECTOR_SIZE
, buf
,
718 partcount
* SECTOR_SIZE
);
719 rc
= flush_current_sector();
726 buf
+= partcount
* SECTOR_SIZE
;
731 offset
= count
& (phys_sector_mult
- 1);
736 rc
= ata_transfer_sectors(start
, count
, (void*)buf
, true);
743 buf
+= count
* SECTOR_SIZE
;
747 rc
= cache_sector(start
);
753 memcpy(sector_cache
.data
, buf
, offset
* SECTOR_SIZE
);
754 rc
= flush_current_sector();
764 mutex_unlock(&ata_mtx
);
768 #endif /* MAX_PHYS_SECTOR_SIZE */
770 static int STORAGE_INIT_ATTR
check_registers(void)
774 if (ATA_IN8(ATA_STATUS
) & STATUS_BSY
)
777 for (i
= 0; i
<64; i
++) {
778 ATA_OUT8(ATA_NSECTOR
, TEST_PATTERN1
);
779 ATA_OUT8(ATA_SECTOR
, TEST_PATTERN2
);
780 ATA_OUT8(ATA_LCYL
, TEST_PATTERN3
);
781 ATA_OUT8(ATA_HCYL
, TEST_PATTERN4
);
783 if (((ATA_IN8(ATA_NSECTOR
) & 0xff) == TEST_PATTERN1
) &&
784 ((ATA_IN8(ATA_SECTOR
) & 0xff) == TEST_PATTERN2
) &&
785 ((ATA_IN8(ATA_LCYL
) & 0xff) == TEST_PATTERN3
) &&
786 ((ATA_IN8(ATA_HCYL
) & 0xff) == TEST_PATTERN4
))
794 static int freeze_lock(void)
796 /* does the disk support Security Mode feature set? */
797 if (identify_info
[82] & 2)
799 ATA_OUT8(ATA_SELECT
, ata_device
);
804 ATA_OUT8(ATA_COMMAND
, CMD_SECURITY_FREEZE_LOCK
);
813 void ata_spindown(int seconds
)
815 sleep_timeout
= seconds
* HZ
;
818 bool ata_disk_is_active(void)
823 static int ata_perform_sleep(void)
825 /* guard against calls made with checks of these variables outside
826 the mutex that may not be on the ata thread; status may have changed. */
827 if (spinup
|| sleeping
) {
831 ATA_OUT8(ATA_SELECT
, ata_device
);
833 if(!wait_for_rdy()) {
834 DEBUGF("ata_perform_sleep() - not RDY\n");
838 ATA_OUT8(ATA_COMMAND
, CMD_SLEEP
);
842 DEBUGF("ata_perform_sleep() - CMD failed\n");
852 queue_post(&ata_queue
, Q_SLEEP
, 0);
855 void ata_sleepnow(void)
857 if (!spinup
&& !sleeping
&& initialized
)
859 call_storage_idle_notifys(false);
860 mutex_lock(&ata_mtx
);
862 mutex_unlock(&ata_mtx
);
868 last_user_activity
= current_tick
;
871 static void ata_thread(void)
873 #ifdef HAVE_ATA_POWER_OFF
874 static long last_sleep
= 0;
876 struct queue_event ev
;
877 #ifdef ALLOW_USB_SPINDOWN
878 static bool usb_mode
= false;
882 queue_wait_w_tmo(&ata_queue
, &ev
, HZ
/2);
886 if (!spinup
&& !sleeping
)
888 if (TIME_AFTER( current_tick
,
889 last_disk_activity
+ (HZ
*2) ) )
891 #ifdef ALLOW_USB_SPINDOWN
895 call_storage_idle_notifys(false);
899 if ( sleep_timeout
&&
900 TIME_AFTER( current_tick
,
901 last_user_activity
+ sleep_timeout
) &&
902 TIME_AFTER( current_tick
,
903 last_disk_activity
+ sleep_timeout
) )
905 #ifdef ALLOW_USB_SPINDOWN
909 call_storage_idle_notifys(true);
911 mutex_lock(&ata_mtx
);
913 #ifdef HAVE_ATA_POWER_OFF
914 last_sleep
= current_tick
;
916 mutex_unlock(&ata_mtx
);
920 #ifdef HAVE_ATA_POWER_OFF
921 if ( !spinup
&& sleeping
&& !poweroff
&&
922 TIME_AFTER( current_tick
, last_sleep
+ ATA_POWER_OFF_TIMEOUT
))
924 mutex_lock(&ata_mtx
);
925 ide_power_enable(false);
927 mutex_unlock(&ata_mtx
);
933 case SYS_USB_CONNECTED
:
934 /* Tell the USB thread that we are safe */
935 DEBUGF("ata_thread got SYS_USB_CONNECTED\n");
936 #ifdef ALLOW_USB_SPINDOWN
938 usb_acknowledge(SYS_USB_CONNECTED_ACK
);
939 /* There is no need to force ATA power on */
941 mutex_lock(&ata_mtx
);
944 sleeping
= false; /* set this now since it'll be on */
946 #ifdef HAVE_ATA_POWER_OFF
954 perform_soft_reset();
959 mutex_unlock(&ata_mtx
);
961 /* Wait until the USB cable is extracted again */
962 usb_acknowledge(SYS_USB_CONNECTED_ACK
);
963 usb_wait_for_disconnect(&ata_queue
);
967 #ifdef ALLOW_USB_SPINDOWN
968 case SYS_USB_DISCONNECTED
:
969 /* Tell the USB thread that we are ready again */
970 DEBUGF("ata_thread got SYS_USB_DISCONNECTED\n");
974 #endif /* USB_NONE */
977 #ifdef ALLOW_USB_SPINDOWN
981 call_storage_idle_notifys(false);
983 last_disk_activity
= current_tick
- sleep_timeout
+ (HZ
/2);
986 #ifdef ATA_DRIVER_CLOSE
994 /* Hardware reset protocol as specified in chapter 9.1, ATA spec draft v5 */
995 #ifdef HAVE_ATA_POWER_OFF
996 static int ata_hard_reset(void)
998 static int STORAGE_INIT_ATTR
ata_hard_reset(void)
1003 mutex_lock(&ata_mtx
);
1008 ATA_OUT8(ATA_SELECT
, ata_device
); /* select the right device */
1009 ret
= wait_for_bsy();
1011 /* Massage the return code so it is 0 on success and -1 on failure */
1014 mutex_unlock(&ata_mtx
);
1019 static int perform_soft_reset(void)
1021 /* If this code is allowed to run on a Nano, the next reads from the flash will
1022 * time out, so we disable it. It shouldn't be necessary anyway, since the
1023 * ATA -> Flash interface automatically sleeps almost immediately after the
1029 ATA_OUT8(ATA_SELECT
, SELECT_LBA
| ata_device
);
1030 ATA_OUT8(ATA_CONTROL
, CONTROL_nIEN
|CONTROL_SRST
);
1031 sleep(1); /* >= 5us */
1034 /* DMA requires INTRQ be enabled */
1035 ATA_OUT8(ATA_CONTROL
, 0);
1037 ATA_OUT8(ATA_CONTROL
, CONTROL_nIEN
);
1039 sleep(1); /* >2ms */
1041 /* This little sucker can take up to 30 seconds */
1045 ret
= wait_for_rdy();
1046 } while(!ret
&& retry_count
--);
1054 if (set_multiple_mode(multisectors
))
1063 int ata_soft_reset(void)
1067 mutex_lock(&ata_mtx
);
1069 ret
= perform_soft_reset();
1071 mutex_unlock(&ata_mtx
);
1075 #ifdef HAVE_ATA_POWER_OFF
1076 static int ata_power_on(void)
1080 ide_power_enable(true);
1081 sleep(HZ
/4); /* allow voltage to build up */
1083 /* Accessing the PP IDE controller too early after powering up the disk
1084 * makes the core hang for a short time, causing an audio dropout. This
1085 * also depends on the disk; iPod Mini G2 needs at least HZ/5 to get rid
1086 * of the dropout. Since this time isn't additive (the wait_for_bsy() in
1087 * ata_hard_reset() will shortened by the same amount), it's a good idea
1088 * to do this on all HDD based targets. */
1090 if( ata_hard_reset() )
1093 rc
= set_features();
1097 if (set_multiple_mode(multisectors
))
1107 static int STORAGE_INIT_ATTR
master_slave_detect(void)
1110 ATA_OUT8(ATA_SELECT
, 0);
1111 if (ATA_IN8(ATA_STATUS
) & (STATUS_RDY
|STATUS_BSY
)) {
1113 DEBUGF("Found master harddisk\n");
1117 ATA_OUT8(ATA_SELECT
, SELECT_DEVICE1
);
1118 if (ATA_IN8(ATA_STATUS
) & (STATUS_RDY
|STATUS_BSY
)) {
1119 ata_device
= SELECT_DEVICE1
;
1120 DEBUGF("Found slave harddisk\n");
1128 static int STORAGE_INIT_ATTR
identify(void)
1132 ATA_OUT8(ATA_SELECT
, ata_device
);
1134 if(!wait_for_rdy()) {
1135 DEBUGF("identify() - not RDY\n");
1138 ATA_OUT8(ATA_COMMAND
, CMD_IDENTIFY
);
1140 if (!wait_for_start_of_transfer())
1142 DEBUGF("identify() - CMD failed\n");
1146 for (i
=0; i
<SECTOR_SIZE
/2; i
++) {
1147 /* the IDENTIFY words are already swapped, so we need to treat
1148 this info differently that normal sector data */
1149 identify_info
[i
] = ATA_SWAP_IDENTIFY(ATA_IN16(ATA_DATA
));
1155 static int set_multiple_mode(int sectors
)
1157 ATA_OUT8(ATA_SELECT
, ata_device
);
1159 if(!wait_for_rdy()) {
1160 DEBUGF("set_multiple_mode() - not RDY\n");
1164 ATA_OUT8(ATA_NSECTOR
, sectors
);
1165 ATA_OUT8(ATA_COMMAND
, CMD_SET_MULTIPLE_MODE
);
1167 if (!wait_for_rdy())
1169 DEBUGF("set_multiple_mode() - CMD failed\n");
1177 static int get_best_mode(unsigned short identword
, int max
, int modetype
)
1179 unsigned short testbit
= BIT_N(max
);
1182 if (identword
& testbit
)
1183 return max
| modetype
;
1192 static int set_features(void)
1195 unsigned char id_word
;
1196 unsigned char id_bit
;
1197 unsigned char subcommand
;
1198 unsigned char parameter
;
1200 { 83, 14, 0x03, 0 }, /* force PIO mode */
1201 { 83, 3, 0x05, 0x80 }, /* adv. power management: lowest w/o standby */
1202 { 83, 9, 0x42, 0x80 }, /* acoustic management: lowest noise */
1203 { 82, 6, 0xaa, 0 }, /* enable read look-ahead */
1205 { 0, 0, 0x03, 0 }, /* DMA mode */
1211 /* Find out the highest supported PIO mode */
1212 if(identify_info
[64] & 2)
1215 if(identify_info
[64] & 1)
1218 /* Update the table: set highest supported pio mode that we also support */
1219 features
[0].parameter
= 8 + pio_mode
;
1222 if (identify_info
[53] & (1<<2))
1223 /* Ultra DMA mode info present, find a mode */
1224 dma_mode
= get_best_mode(identify_info
[88], ATA_MAX_UDMA
, 0x40);
1227 /* No UDMA mode found, try to find a multi-word DMA mode */
1228 dma_mode
= get_best_mode(identify_info
[63], ATA_MAX_MWDMA
, 0x20);
1229 features
[4].id_word
= 63;
1232 features
[4].id_word
= 88;
1234 features
[4].id_bit
= dma_mode
& 7;
1235 features
[4].parameter
= dma_mode
;
1236 #endif /* HAVE_ATA_DMA */
1238 ATA_OUT8(ATA_SELECT
, ata_device
);
1240 if (!wait_for_rdy()) {
1241 DEBUGF("set_features() - not RDY\n");
1245 for (i
=0; i
< (int)(sizeof(features
)/sizeof(features
[0])); i
++) {
1246 if (identify_info
[features
[i
].id_word
] & BIT_N(features
[i
].id_bit
)) {
1247 ATA_OUT8(ATA_FEATURE
, features
[i
].subcommand
);
1248 ATA_OUT8(ATA_NSECTOR
, features
[i
].parameter
);
1249 ATA_OUT8(ATA_COMMAND
, CMD_SET_FEATURES
);
1251 if (!wait_for_rdy()) {
1252 DEBUGF("set_features() - CMD failed\n");
1256 if((ATA_IN8(ATA_ALT_STATUS
) & STATUS_ERR
) && (i
!= 1)) {
1257 /* some CF cards don't like advanced powermanagement
1258 even if they mark it as supported - go figure... */
1259 if(ATA_IN8(ATA_ERROR
) & ERROR_ABRT
) {
1266 #ifdef ATA_SET_PIO_TIMING
1267 ata_set_pio_timings(pio_mode
);
1271 ata_dma_set_mode(dma_mode
);
1277 unsigned short* ata_get_identify(void)
1279 return identify_info
;
1282 static int STORAGE_INIT_ATTR
init_and_check(bool hard_reset
)
1288 /* This should reset both master and slave, we don't yet know what's in */
1290 if (ata_hard_reset())
1294 rc
= master_slave_detect();
1298 /* symptom fix: else check_registers() below may fail */
1299 if (hard_reset
&& !wait_for_bsy())
1302 rc
= check_registers();
1309 int STORAGE_INIT_ATTR
ata_init(void)
1314 if ( !initialized
) {
1315 mutex_init(&ata_mtx
);
1316 queue_init(&ata_queue
, true);
1319 mutex_lock(&ata_mtx
);
1321 /* must be called before ata_device_init() */
1322 coldstart
= ata_is_coldstart();
1327 #ifdef MAX_PHYS_SECTOR_SIZE
1328 memset(§or_cache
, 0, sizeof(sector_cache
));
1331 if ( !initialized
) {
1332 /* First call won't have multiple thread contention - this
1333 * may return at any point without having to unlock */
1334 mutex_unlock(&ata_mtx
);
1336 if (!ide_powered()) /* somebody has switched it off */
1338 ide_power_enable(true);
1339 sleep(HZ
/4); /* allow voltage to build up */
1343 /* DMA requires INTRQ be enabled */
1344 ATA_OUT8(ATA_CONTROL
, 0);
1347 /* first try, hard reset at cold start only */
1348 rc
= init_and_check(coldstart
);
1351 { /* failed? -> second try, always with hard reset */
1352 DEBUGF("ata: init failed, retrying...\n");
1353 rc
= init_and_check(true);
1363 multisectors
= identify_info
[47] & 0xff;
1364 if (multisectors
== 0) /* Invalid multisector info, try with 16 */
1367 DEBUGF("ata: %d sectors per ata request\n",multisectors
);
1369 total_sectors
= identify_info
[60] | (identify_info
[61] << 16);
1372 if (identify_info
[83] & 0x0400 /* 48 bit address support */
1373 && total_sectors
== 0x0FFFFFFF) /* and disk size >= 128 GiB */
1374 { /* (needs BigLBA addressing) */
1375 if (identify_info
[102] || identify_info
[103])
1376 panicf("Unsupported disk size: >= 2^32 sectors");
1378 total_sectors
= identify_info
[100] | (identify_info
[101] << 16);
1379 lba48
= true; /* use BigLBA */
1387 rc
= set_features();
1391 #ifdef MAX_PHYS_SECTOR_SIZE
1392 /* Find out the physical sector size */
1393 if((identify_info
[106] & 0xe000) == 0x6000)
1394 phys_sector_mult
= BIT_N(identify_info
[106] & 0x000f);
1396 phys_sector_mult
= 1;
1398 DEBUGF("ata: %d logical sectors per phys sector", phys_sector_mult
);
1400 if (phys_sector_mult
> 1)
1402 /* Check if drive really needs emulation - if we can access
1403 * sector 1 then assume the drive will handle it better than
1404 * us, and ignore the large physical sectors.
1406 char throwaway
[SECTOR_SIZE
];
1407 rc
= ata_transfer_sectors(1, 1, &throwaway
, false);
1409 phys_sector_mult
= 1;
1412 if (phys_sector_mult
> (MAX_PHYS_SECTOR_SIZE
/SECTOR_SIZE
))
1413 panicf("Unsupported physical sector size: %d",
1414 phys_sector_mult
* SECTOR_SIZE
);
1417 mutex_lock(&ata_mtx
); /* Balance unlock below */
1419 last_disk_activity
= current_tick
;
1420 #ifdef ATA_DRIVER_CLOSE
1423 create_thread(ata_thread
, ata_stack
,
1424 sizeof(ata_stack
), 0, ata_thread_name
1425 IF_PRIO(, PRIORITY_USER_INTERFACE
)
1430 rc
= set_multiple_mode(multisectors
);
1434 mutex_unlock(&ata_mtx
);
1438 #ifdef ATA_DRIVER_CLOSE
1439 void ata_close(void)
1441 unsigned int thread_id
= ata_thread_id
;
1448 queue_post(&ata_queue
, Q_CLOSE
, 0);
1449 thread_wait(thread_id
);
1451 #endif /* ATA_DRIVER_CLOSE */
1453 #if (CONFIG_LED == LED_REAL)
1454 void ata_set_led_enabled(bool enabled
)
1456 ata_led_enabled
= enabled
;
1457 if (ata_led_enabled
)
1464 long ata_last_disk_activity(void)
1466 return last_disk_activity
;
1469 int ata_spinup_time(void)
1474 #ifdef STORAGE_GET_INFO
1475 void ata_get_info(IF_MD2(int drive
,)struct storage_info
*info
)
1477 unsigned short *src
,*dest
;
1478 static char vendor
[8];
1479 static char product
[16];
1480 static char revision
[4];
1481 #ifdef HAVE_MULTIDRIVE
1482 (void)drive
; /* unused for now */
1485 info
->sector_size
= SECTOR_SIZE
;
1486 info
->num_sectors
= total_sectors
;
1488 src
= (unsigned short*)&identify_info
[27];
1489 dest
= (unsigned short*)vendor
;
1491 dest
[i
] = htobe16(src
[i
]);
1492 info
->vendor
=vendor
;
1494 src
= (unsigned short*)&identify_info
[31];
1495 dest
= (unsigned short*)product
;
1497 dest
[i
] = htobe16(src
[i
]);
1498 info
->product
=product
;
1500 src
= (unsigned short*)&identify_info
[23];
1501 dest
= (unsigned short*)revision
;
1503 dest
[i
] = htobe16(src
[i
]);
1504 info
->revision
=revision
;
1509 /* Returns last DMA mode as set by set_features() */
1510 int ata_get_dma_mode(void)
1515 /* Needed to allow updating while waiting for DMA to complete */
1516 void ata_keep_active(void)
1518 last_disk_activity
= current_tick
;
1522 #ifdef CONFIG_STORAGE_MULTI
1523 int ata_num_drives(int first_drive
)
1525 /* We don't care which logical drive number(s) we have been assigned */