summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTorne Wuff <torne@wolfpuppy.org.uk>2010-04-14 14:40:03 +0000
committerTorne Wuff <torne@wolfpuppy.org.uk>2010-04-14 14:40:03 +0000
commit99cd7f8c194a965cd5f2031e151b898ed190b636 (patch)
treedc2fa17d820ce4fee1413ef16edffe301c586697
parent4157a31924be37b440c92df8a141ada7e7bfb704 (diff)
downloadrockbox-99cd7f8c194a965cd5f2031e151b898ed190b636.tar.gz
rockbox-99cd7f8c194a965cd5f2031e151b898ed190b636.zip
Make builds with MAX_PHYS_SECTOR_SIZE defined (ipod video) work with larger sizes if the drive is sane.
The ipod video build has a MAX_PHYS_SECTOR_SIZE of 1024. This meant it would refuse to boot on drives with sectors larger than 1024 bytes, even if those drives don't actually require the workaround originally intended for the 80GB 5.5G's drive. ata_init() will now, if the drive claims to have >512 byte sectors, try and read sector 1 to determine if the drive is capable of emulating 512-byte sector accesses. If this succeeds, we assume the drive is better at it than us (this is very likely to be true) and set phys_sector_mult to 1, disabling the workaround and ensuring the drive will work regardless of sector size. Making use of this change requires that you build and install an updated bootloader as well as the main build; a new iPod bootloader will be released soon, so if you can't do this yourself, be patient. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@25646 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/drivers/ata.c40
1 files changed, 26 insertions, 14 deletions
diff --git a/firmware/drivers/ata.c b/firmware/drivers/ata.c
index 2140456e6b..4780cf5c0f 100644
--- a/firmware/drivers/ata.c
+++ b/firmware/drivers/ata.c
@@ -1351,20 +1351,6 @@ int ata_init(void)
1351 1351
1352 DEBUGF("ata: %d sectors per ata request\n",multisectors); 1352 DEBUGF("ata: %d sectors per ata request\n",multisectors);
1353 1353
1354#ifdef MAX_PHYS_SECTOR_SIZE
1355 /* Find out the physical sector size */
1356 if((identify_info[106] & 0xe000) == 0x6000)
1357 phys_sector_mult = BIT_N(identify_info[106] & 0x000f);
1358 else
1359 phys_sector_mult = 1;
1360
1361 DEBUGF("ata: %d logical sectors per phys sector", phys_sector_mult);
1362
1363 if (phys_sector_mult > (MAX_PHYS_SECTOR_SIZE/SECTOR_SIZE))
1364 panicf("Unsupported physical sector size: %d",
1365 phys_sector_mult * SECTOR_SIZE);
1366#endif
1367
1368 total_sectors = identify_info[60] | (identify_info[61] << 16); 1354 total_sectors = identify_info[60] | (identify_info[61] << 16);
1369 1355
1370#ifdef HAVE_LBA48 1356#ifdef HAVE_LBA48
@@ -1387,6 +1373,32 @@ int ata_init(void)
1387 if (rc) 1373 if (rc)
1388 return -60 + rc; 1374 return -60 + rc;
1389 1375
1376#ifdef MAX_PHYS_SECTOR_SIZE
1377 /* Find out the physical sector size */
1378 if((identify_info[106] & 0xe000) == 0x6000)
1379 phys_sector_mult = BIT_N(identify_info[106] & 0x000f);
1380 else
1381 phys_sector_mult = 1;
1382
1383 DEBUGF("ata: %d logical sectors per phys sector", phys_sector_mult);
1384
1385 if (phys_sector_mult > 1)
1386 {
1387 /* Check if drive really needs emulation - if we can access
1388 * sector 1 then assume the drive will handle it better than
1389 * us, and ignore the large physical sectors.
1390 */
1391 char throwaway[SECTOR_SIZE];
1392 rc = ata_transfer_sectors(1, 1, &throwaway, false);
1393 if (rc == 0)
1394 phys_sector_mult = 1;
1395 }
1396
1397 if (phys_sector_mult > (MAX_PHYS_SECTOR_SIZE/SECTOR_SIZE))
1398 panicf("Unsupported physical sector size: %d",
1399 phys_sector_mult * SECTOR_SIZE);
1400#endif
1401
1390 mutex_lock(&ata_mtx); /* Balance unlock below */ 1402 mutex_lock(&ata_mtx); /* Balance unlock below */
1391 1403
1392 last_disk_activity = current_tick; 1404 last_disk_activity = current_tick;