diff options
Diffstat (limited to 'firmware')
-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 |