summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTorne Wuff <torne@wolfpuppy.org.uk>2010-04-07 20:01:21 +0000
committerTorne Wuff <torne@wolfpuppy.org.uk>2010-04-07 20:01:21 +0000
commit62321ed0bd7d8d5879a9caad3d8f642dbe876033 (patch)
treee569e1e2ec72f7300ddf956831a21cef427cfc9b
parentb3d44fcb57173b7995bf67a88aa24aa447f74f52 (diff)
downloadrockbox-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.c11
-rw-r--r--firmware/target/arm/archos/av300/ata-target.h1
-rw-r--r--firmware/target/arm/ata-target.h1
-rw-r--r--firmware/target/arm/imx31/gigabeat-s/ata-target.h1
-rw-r--r--firmware/target/arm/s3c2440/gigabeat-fx/ata-target.h1
-rw-r--r--firmware/target/arm/tms320dm320/creative-zvm/ata-target.h1
-rw-r--r--firmware/target/arm/tms320dm320/mrobe-500/ata-target.h1
-rw-r--r--firmware/target/coldfire/ata-target.h1
-rw-r--r--firmware/target/sh/archos/ata-target.h1
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