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.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
-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 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 |