summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
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