summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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