diff options
Diffstat (limited to 'firmware/drivers/ata.c')
-rw-r--r-- | firmware/drivers/ata.c | 69 |
1 files changed, 15 insertions, 54 deletions
diff --git a/firmware/drivers/ata.c b/firmware/drivers/ata.c index 9c37a15537..8593eebea1 100644 --- a/firmware/drivers/ata.c +++ b/firmware/drivers/ata.c | |||
@@ -274,48 +274,6 @@ int ide_read_register(int reg) { | |||
274 | return ide_reg_temp; | 274 | return ide_reg_temp; |
275 | } | 275 | } |
276 | 276 | ||
277 | #elif defined(TOSHIBA_GIGABEAT_F) | ||
278 | |||
279 | /* Plain C read & write loops */ | ||
280 | #define PREFER_C_READING | ||
281 | #define PREFER_C_WRITING | ||
282 | |||
283 | #define ATA_IOBASE 0x18000000 | ||
284 | #define ATA_DATA (*((volatile unsigned short*)(ATA_IOBASE))) | ||
285 | #define ATA_ERROR (*((volatile unsigned char*)(ATA_IOBASE + 0x02))) | ||
286 | #define ATA_NSECTOR (*((volatile unsigned char*)(ATA_IOBASE + 0x04))) | ||
287 | #define ATA_SECTOR (*((volatile unsigned char*)(ATA_IOBASE + 0x06))) | ||
288 | #define ATA_LCYL (*((volatile unsigned char*)(ATA_IOBASE + 0x08))) | ||
289 | #define ATA_HCYL (*((volatile unsigned char*)(ATA_IOBASE + 0x10))) | ||
290 | #define ATA_SELECT (*((volatile unsigned char*)(ATA_IOBASE + 0x12))) | ||
291 | #define ATA_COMMAND (*((volatile unsigned char*)(ATA_IOBASE + 0x14))) | ||
292 | #define ATA_CONTROL (*((volatile unsigned char*)(0x20000000 + 0x1c))) | ||
293 | |||
294 | #define STATUS_BSY 0x80 | ||
295 | #define STATUS_RDY 0x40 | ||
296 | #define STATUS_DF 0x20 | ||
297 | #define STATUS_DRQ 0x08 | ||
298 | #define STATUS_ERR 0x01 | ||
299 | #define ERROR_ABRT 0x04 | ||
300 | |||
301 | #define WRITE_PATTERN1 0xa5 | ||
302 | #define WRITE_PATTERN2 0x5a | ||
303 | #define WRITE_PATTERN3 0xaa | ||
304 | #define WRITE_PATTERN4 0x55 | ||
305 | |||
306 | #define READ_PATTERN1 0xa5 | ||
307 | #define READ_PATTERN2 0x5a | ||
308 | #define READ_PATTERN3 0xaa | ||
309 | #define READ_PATTERN4 0x55 | ||
310 | |||
311 | #define READ_PATTERN1_MASK 0xff | ||
312 | #define READ_PATTERN2_MASK 0xff | ||
313 | #define READ_PATTERN3_MASK 0xff | ||
314 | #define READ_PATTERN4_MASK 0xff | ||
315 | |||
316 | #define SET_REG(reg,val) reg = (val) | ||
317 | #define SET_16BITREG(reg,val) reg = (val) | ||
318 | |||
319 | #endif | 277 | #endif |
320 | 278 | ||
321 | #ifndef NOINLINE_ATTR | 279 | #ifndef NOINLINE_ATTR |
@@ -323,6 +281,7 @@ int ide_read_register(int reg) { | |||
323 | #endif | 281 | #endif |
324 | 282 | ||
325 | #define ATA_FEATURE ATA_ERROR | 283 | #define ATA_FEATURE ATA_ERROR |
284 | |||
326 | #define ATA_STATUS ATA_COMMAND | 285 | #define ATA_STATUS ATA_COMMAND |
327 | #define ATA_ALT_STATUS ATA_CONTROL | 286 | #define ATA_ALT_STATUS ATA_CONTROL |
328 | 287 | ||
@@ -348,7 +307,6 @@ int ide_read_register(int reg) { | |||
348 | 307 | ||
349 | #define READ_TIMEOUT 5*HZ | 308 | #define READ_TIMEOUT 5*HZ |
350 | 309 | ||
351 | |||
352 | static struct mutex ata_mtx; | 310 | static struct mutex ata_mtx; |
353 | char ata_device; /* device 0 (master) or 1 (slave) */ | 311 | char ata_device; /* device 0 (master) or 1 (slave) */ |
354 | int ata_io_address; /* 0x300 or 0x200, only valid on recorder */ | 312 | int ata_io_address; /* 0x300 or 0x200, only valid on recorder */ |
@@ -430,6 +388,7 @@ static int wait_for_start_of_transfer(void) | |||
430 | { | 388 | { |
431 | if (!wait_for_bsy()) | 389 | if (!wait_for_bsy()) |
432 | return 0; | 390 | return 0; |
391 | |||
433 | return (ATA_ALT_STATUS & (STATUS_BSY|STATUS_DRQ)) == STATUS_DRQ; | 392 | return (ATA_ALT_STATUS & (STATUS_BSY|STATUS_DRQ)) == STATUS_DRQ; |
434 | } | 393 | } |
435 | 394 | ||
@@ -1402,16 +1361,16 @@ static int check_registers(void) | |||
1402 | return -1; | 1361 | return -1; |
1403 | 1362 | ||
1404 | for (i = 0; i<64; i++) { | 1363 | for (i = 0; i<64; i++) { |
1405 | SET_REG(ATA_NSECTOR, WRITE_PATTERN1); | 1364 | SET_REG(ATA_NSECTOR, WRITE_PATTERN1); |
1406 | SET_REG(ATA_SECTOR, WRITE_PATTERN2); | 1365 | SET_REG(ATA_SECTOR, WRITE_PATTERN2); |
1407 | SET_REG(ATA_LCYL, WRITE_PATTERN3); | 1366 | SET_REG(ATA_LCYL, WRITE_PATTERN3); |
1408 | SET_REG(ATA_HCYL, WRITE_PATTERN4); | 1367 | SET_REG(ATA_HCYL, WRITE_PATTERN4); |
1409 | 1368 | ||
1410 | if (((ATA_NSECTOR & READ_PATTERN1_MASK) == READ_PATTERN1) && | 1369 | if (((ATA_NSECTOR & READ_PATTERN1_MASK) == READ_PATTERN1) && |
1411 | ((ATA_SECTOR & READ_PATTERN2_MASK) == READ_PATTERN2) && | 1370 | ((ATA_SECTOR & READ_PATTERN2_MASK) == READ_PATTERN2) && |
1412 | ((ATA_LCYL & READ_PATTERN3_MASK) == READ_PATTERN3) && | 1371 | ((ATA_LCYL & READ_PATTERN3_MASK) == READ_PATTERN3) && |
1413 | ((ATA_HCYL & READ_PATTERN4_MASK) == READ_PATTERN4)) | 1372 | ((ATA_HCYL & READ_PATTERN4_MASK) == READ_PATTERN4)) |
1414 | return 0; | 1373 | return 0; |
1415 | } | 1374 | } |
1416 | return -2; | 1375 | return -2; |
1417 | #endif | 1376 | #endif |
@@ -1957,12 +1916,15 @@ int ata_init(void) | |||
1957 | } | 1916 | } |
1958 | 1917 | ||
1959 | rc = identify(); | 1918 | rc = identify(); |
1919 | |||
1960 | if (rc) | 1920 | if (rc) |
1961 | return -40 + rc; | 1921 | return -40 + rc; |
1922 | |||
1962 | multisectors = identify_info[47] & 0xff; | 1923 | multisectors = identify_info[47] & 0xff; |
1963 | DEBUGF("ata: %d sectors per ata request\n",multisectors); | 1924 | DEBUGF("ata: %d sectors per ata request\n",multisectors); |
1964 | 1925 | ||
1965 | rc = freeze_lock(); | 1926 | rc = freeze_lock(); |
1927 | |||
1966 | if (rc) | 1928 | if (rc) |
1967 | return -50 + rc; | 1929 | return -50 + rc; |
1968 | 1930 | ||
@@ -1977,7 +1939,6 @@ int ata_init(void) | |||
1977 | sizeof(ata_stack), ata_thread_name); | 1939 | sizeof(ata_stack), ata_thread_name); |
1978 | initialized = true; | 1940 | initialized = true; |
1979 | 1941 | ||
1980 | |||
1981 | } | 1942 | } |
1982 | rc = set_multiple_mode(multisectors); | 1943 | rc = set_multiple_mode(multisectors); |
1983 | if (rc) | 1944 | if (rc) |