diff options
| author | Torne Wuff <torne@wolfpuppy.org.uk> | 2010-04-07 20:01:21 +0000 |
|---|---|---|
| committer | Torne Wuff <torne@wolfpuppy.org.uk> | 2010-04-07 20:01:21 +0000 |
| commit | 62321ed0bd7d8d5879a9caad3d8f642dbe876033 (patch) | |
| tree | e569e1e2ec72f7300ddf956831a21cef427cfc9b | |
| parent | b3d44fcb57173b7995bf67a88aa24aa447f74f52 (diff) | |
| download | rockbox-62321ed0bd7d8d5879a9caad3d8f642dbe876033.zip rockbox-62321ed0bd7d8d5879a9caad3d8f642dbe876033.tar.gz rockbox-62321ed0bd7d8d5879a9caad3d8f642dbe876033.tar.bz2 rockbox-62321ed0bd7d8d5879a9caad3d8f642dbe876033.tar.xz | |
Make ATA code not bother to retry requests that return IDNF (specified sector not valid).
There's no point retrying these requests for five seconds, the sector number isn't going to get any more valid. It interferes with being able to detect broken drives like the 5.5G 80GB iPod's.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@25525 a1c6a512-1295-4272-9138-f99709370657
| -rw-r--r-- | firmware/drivers/ata.c | 11 | ||||
| -rw-r--r-- | firmware/target/arm/archos/av300/ata-target.h | 1 | ||||
| -rw-r--r-- | firmware/target/arm/ata-target.h | 1 | ||||
| -rw-r--r-- | firmware/target/arm/imx31/gigabeat-s/ata-target.h | 1 | ||||
| -rw-r--r-- | firmware/target/arm/s3c2440/gigabeat-fx/ata-target.h | 1 | ||||
| -rw-r--r-- | firmware/target/arm/tms320dm320/creative-zvm/ata-target.h | 1 | ||||
| -rw-r--r-- | firmware/target/arm/tms320dm320/mrobe-500/ata-target.h | 1 | ||||
| -rw-r--r-- | firmware/target/coldfire/ata-target.h | 1 | ||||
| -rw-r--r-- | firmware/target/sh/archos/ata-target.h | 1 |
9 files changed, 19 insertions, 0 deletions
diff --git a/firmware/drivers/ata.c b/firmware/drivers/ata.c index ddbd6a1..2140456 100644 --- a/firmware/drivers/ata.c +++ b/firmware/drivers/ata.c @@ -478,6 +478,7 @@ static int ata_transfer_sectors(unsigned long start, int sectors; int wordcount; int status; + int error; if (!wait_for_start_of_transfer()) { /* We have timed out waiting for RDY and/or DRQ, possibly @@ -502,6 +503,7 @@ static int ata_transfer_sectors(unsigned long start, /* read the status register exactly once per loop */ status = ATA_STATUS; + error = ATA_ERROR; if (count >= multisectors ) sectors = multisectors; @@ -526,6 +528,9 @@ static int ata_transfer_sectors(unsigned long start, if ( status & (STATUS_BSY | STATUS_ERR | STATUS_DF) ) { perform_soft_reset(); ret = -6; + /* no point retrying IDNF, sector no. was invalid */ + if (error & ERROR_IDNF) + break; goto retry; } @@ -537,8 +542,14 @@ static int ata_transfer_sectors(unsigned long start, } if(!ret && !wait_for_end_of_transfer()) { + int error; + + error = ATA_ERROR; perform_soft_reset(); ret = -4; + /* no point retrying IDNF, sector no. was invalid */ + if (error & ERROR_IDNF) + break; goto retry; } break; diff --git a/firmware/target/arm/archos/av300/ata-target.h b/firmware/target/arm/archos/av300/ata-target.h index f1b1d7d..9c59acc 100644 --- a/firmware/target/arm/archos/av300/ata-target.h +++ b/firmware/target/arm/archos/av300/ata-target.h @@ -39,6 +39,7 @@ #define STATUS_DRQ 0x08 #define STATUS_ERR 0x01 #define ERROR_ABRT 0x04 +#define ERROR_IDNF 0x10 #define WRITE_PATTERN1 0xa5 #define WRITE_PATTERN2 0x5a diff --git a/firmware/target/arm/ata-target.h b/firmware/target/arm/ata-target.h index 82c5a5f..c9d789d 100644 --- a/firmware/target/arm/ata-target.h +++ b/firmware/target/arm/ata-target.h @@ -38,6 +38,7 @@ #define STATUS_DRQ 0x08 #define STATUS_ERR 0x01 #define ERROR_ABRT 0x04 +#define ERROR_IDNF 0x10 #define WRITE_PATTERN1 0xa5 #define WRITE_PATTERN2 0x5a diff --git a/firmware/target/arm/imx31/gigabeat-s/ata-target.h b/firmware/target/arm/imx31/gigabeat-s/ata-target.h index 8b308f2..f7f84f8 100644 --- a/firmware/target/arm/imx31/gigabeat-s/ata-target.h +++ b/firmware/target/arm/imx31/gigabeat-s/ata-target.h @@ -52,6 +52,7 @@ #define STATUS_DRQ 0x08 #define STATUS_ERR 0x01 #define ERROR_ABRT 0x04 +#define ERROR_IDNF 0x10 #define WRITE_PATTERN1 0xa5 #define WRITE_PATTERN2 0x5a diff --git a/firmware/target/arm/s3c2440/gigabeat-fx/ata-target.h b/firmware/target/arm/s3c2440/gigabeat-fx/ata-target.h index 54d0964..01cdbb9 100644 --- a/firmware/target/arm/s3c2440/gigabeat-fx/ata-target.h +++ b/firmware/target/arm/s3c2440/gigabeat-fx/ata-target.h @@ -50,6 +50,7 @@ void copy_read_sectors(unsigned char* buf, int wordcount); #define STATUS_DRQ 0x08 #define STATUS_ERR 0x01 #define ERROR_ABRT 0x04 +#define ERROR_IDNF 0x10 #define WRITE_PATTERN1 0xa5 #define WRITE_PATTERN2 0x5a diff --git a/firmware/target/arm/tms320dm320/creative-zvm/ata-target.h b/firmware/target/arm/tms320dm320/creative-zvm/ata-target.h index a1d4a90..46713e7 100644 --- a/firmware/target/arm/tms320dm320/creative-zvm/ata-target.h +++ b/firmware/target/arm/tms320dm320/creative-zvm/ata-target.h @@ -59,6 +59,7 @@ extern int _ata_write_sectors(IF_MD2(int drive,) unsigned long start, int count, #define STATUS_DRQ 0x08 #define STATUS_ERR 0x01 #define ERROR_ABRT 0x04 +#define ERROR_IDNF 0x10 #define WRITE_PATTERN1 0xa5 #define WRITE_PATTERN2 0x5a diff --git a/firmware/target/arm/tms320dm320/mrobe-500/ata-target.h b/firmware/target/arm/tms320dm320/mrobe-500/ata-target.h index 2a9d3e8..0abeb2e 100644 --- a/firmware/target/arm/tms320dm320/mrobe-500/ata-target.h +++ b/firmware/target/arm/tms320dm320/mrobe-500/ata-target.h @@ -55,6 +55,7 @@ void copy_write_sectors(const unsigned char* buf, int wordcount); #define STATUS_DRQ 0x08 #define STATUS_ERR 0x01 #define ERROR_ABRT 0x04 +#define ERROR_IDNF 0x10 #define WRITE_PATTERN1 0xa5 #define WRITE_PATTERN2 0x5a diff --git a/firmware/target/coldfire/ata-target.h b/firmware/target/coldfire/ata-target.h index a1c521e..3f462b9 100644 --- a/firmware/target/coldfire/ata-target.h +++ b/firmware/target/coldfire/ata-target.h @@ -44,6 +44,7 @@ #define STATUS_ERR 0x0100 #define ERROR_ABRT 0x0400 +#define ERROR_IDNF 0x1000 #define WRITE_PATTERN1 0xa5 #define WRITE_PATTERN2 0x5a diff --git a/firmware/target/sh/archos/ata-target.h b/firmware/target/sh/archos/ata-target.h index 8937370..aef025e 100644 --- a/firmware/target/sh/archos/ata-target.h +++ b/firmware/target/sh/archos/ata-target.h @@ -46,6 +46,7 @@ #define STATUS_ERR 0x01 #define ERROR_ABRT 0x04 +#define ERROR_IDNF 0x10 #define WRITE_PATTERN1 0xa5 #define WRITE_PATTERN2 0x5a |