summaryrefslogtreecommitdiff
path: root/firmware
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 /firmware
parentb3d44fcb57173b7995bf67a88aa24aa447f74f52 (diff)
downloadrockbox-62321ed0bd7d8d5879a9caad3d8f642dbe876033.tar.gz
rockbox-62321ed0bd7d8d5879a9caad3d8f642dbe876033.zip
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
Diffstat (limited to 'firmware')
-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 ddbd6a1edf..2140456e6b 100644
--- a/firmware/drivers/ata.c
+++ b/firmware/drivers/ata.c
@@ -478,6 +478,7 @@ static int ata_transfer_sectors(unsigned long start,
478 int sectors; 478 int sectors;
479 int wordcount; 479 int wordcount;
480 int status; 480 int status;
481 int error;
481 482
482 if (!wait_for_start_of_transfer()) { 483 if (!wait_for_start_of_transfer()) {
483 /* We have timed out waiting for RDY and/or DRQ, possibly 484 /* We have timed out waiting for RDY and/or DRQ, possibly
@@ -502,6 +503,7 @@ static int ata_transfer_sectors(unsigned long start,
502 503
503 /* read the status register exactly once per loop */ 504 /* read the status register exactly once per loop */
504 status = ATA_STATUS; 505 status = ATA_STATUS;
506 error = ATA_ERROR;
505 507
506 if (count >= multisectors ) 508 if (count >= multisectors )
507 sectors = multisectors; 509 sectors = multisectors;
@@ -526,6 +528,9 @@ static int ata_transfer_sectors(unsigned long start,
526 if ( status & (STATUS_BSY | STATUS_ERR | STATUS_DF) ) { 528 if ( status & (STATUS_BSY | STATUS_ERR | STATUS_DF) ) {
527 perform_soft_reset(); 529 perform_soft_reset();
528 ret = -6; 530 ret = -6;
531 /* no point retrying IDNF, sector no. was invalid */
532 if (error & ERROR_IDNF)
533 break;
529 goto retry; 534 goto retry;
530 } 535 }
531 536
@@ -537,8 +542,14 @@ static int ata_transfer_sectors(unsigned long start,
537 } 542 }
538 543
539 if(!ret && !wait_for_end_of_transfer()) { 544 if(!ret && !wait_for_end_of_transfer()) {
545 int error;
546
547 error = ATA_ERROR;
540 perform_soft_reset(); 548 perform_soft_reset();
541 ret = -4; 549 ret = -4;
550 /* no point retrying IDNF, sector no. was invalid */
551 if (error & ERROR_IDNF)
552 break;
542 goto retry; 553 goto retry;
543 } 554 }
544 break; 555 break;
diff --git a/firmware/target/arm/archos/av300/ata-target.h b/firmware/target/arm/archos/av300/ata-target.h
index f1b1d7dc15..9c59acc460 100644
--- a/firmware/target/arm/archos/av300/ata-target.h
+++ b/firmware/target/arm/archos/av300/ata-target.h
@@ -39,6 +39,7 @@
39#define STATUS_DRQ 0x08 39#define STATUS_DRQ 0x08
40#define STATUS_ERR 0x01 40#define STATUS_ERR 0x01
41#define ERROR_ABRT 0x04 41#define ERROR_ABRT 0x04
42#define ERROR_IDNF 0x10
42 43
43#define WRITE_PATTERN1 0xa5 44#define WRITE_PATTERN1 0xa5
44#define WRITE_PATTERN2 0x5a 45#define WRITE_PATTERN2 0x5a
diff --git a/firmware/target/arm/ata-target.h b/firmware/target/arm/ata-target.h
index 82c5a5f555..c9d789d092 100644
--- a/firmware/target/arm/ata-target.h
+++ b/firmware/target/arm/ata-target.h
@@ -38,6 +38,7 @@
38#define STATUS_DRQ 0x08 38#define STATUS_DRQ 0x08
39#define STATUS_ERR 0x01 39#define STATUS_ERR 0x01
40#define ERROR_ABRT 0x04 40#define ERROR_ABRT 0x04
41#define ERROR_IDNF 0x10
41 42
42#define WRITE_PATTERN1 0xa5 43#define WRITE_PATTERN1 0xa5
43#define WRITE_PATTERN2 0x5a 44#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 8b308f28b5..f7f84f82e9 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 @@
52#define STATUS_DRQ 0x08 52#define STATUS_DRQ 0x08
53#define STATUS_ERR 0x01 53#define STATUS_ERR 0x01
54#define ERROR_ABRT 0x04 54#define ERROR_ABRT 0x04
55#define ERROR_IDNF 0x10
55 56
56#define WRITE_PATTERN1 0xa5 57#define WRITE_PATTERN1 0xa5
57#define WRITE_PATTERN2 0x5a 58#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 54d0964560..01cdbb9ddb 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);
50#define STATUS_DRQ 0x08 50#define STATUS_DRQ 0x08
51#define STATUS_ERR 0x01 51#define STATUS_ERR 0x01
52#define ERROR_ABRT 0x04 52#define ERROR_ABRT 0x04
53#define ERROR_IDNF 0x10
53 54
54#define WRITE_PATTERN1 0xa5 55#define WRITE_PATTERN1 0xa5
55#define WRITE_PATTERN2 0x5a 56#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 a1d4a90cb8..46713e70c5 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,
59#define STATUS_DRQ 0x08 59#define STATUS_DRQ 0x08
60#define STATUS_ERR 0x01 60#define STATUS_ERR 0x01
61#define ERROR_ABRT 0x04 61#define ERROR_ABRT 0x04
62#define ERROR_IDNF 0x10
62 63
63#define WRITE_PATTERN1 0xa5 64#define WRITE_PATTERN1 0xa5
64#define WRITE_PATTERN2 0x5a 65#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 2a9d3e8010..0abeb2e9e7 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);
55#define STATUS_DRQ 0x08 55#define STATUS_DRQ 0x08
56#define STATUS_ERR 0x01 56#define STATUS_ERR 0x01
57#define ERROR_ABRT 0x04 57#define ERROR_ABRT 0x04
58#define ERROR_IDNF 0x10
58 59
59#define WRITE_PATTERN1 0xa5 60#define WRITE_PATTERN1 0xa5
60#define WRITE_PATTERN2 0x5a 61#define WRITE_PATTERN2 0x5a
diff --git a/firmware/target/coldfire/ata-target.h b/firmware/target/coldfire/ata-target.h
index a1c521e7df..3f462b9471 100644
--- a/firmware/target/coldfire/ata-target.h
+++ b/firmware/target/coldfire/ata-target.h
@@ -44,6 +44,7 @@
44#define STATUS_ERR 0x0100 44#define STATUS_ERR 0x0100
45 45
46#define ERROR_ABRT 0x0400 46#define ERROR_ABRT 0x0400
47#define ERROR_IDNF 0x1000
47 48
48#define WRITE_PATTERN1 0xa5 49#define WRITE_PATTERN1 0xa5
49#define WRITE_PATTERN2 0x5a 50#define WRITE_PATTERN2 0x5a
diff --git a/firmware/target/sh/archos/ata-target.h b/firmware/target/sh/archos/ata-target.h
index 893737048e..aef025e1df 100644
--- a/firmware/target/sh/archos/ata-target.h
+++ b/firmware/target/sh/archos/ata-target.h
@@ -46,6 +46,7 @@
46#define STATUS_ERR 0x01 46#define STATUS_ERR 0x01
47 47
48#define ERROR_ABRT 0x04 48#define ERROR_ABRT 0x04
49#define ERROR_IDNF 0x10
49 50
50#define WRITE_PATTERN1 0xa5 51#define WRITE_PATTERN1 0xa5
51#define WRITE_PATTERN2 0x5a 52#define WRITE_PATTERN2 0x5a