summaryrefslogtreecommitdiff
path: root/firmware/usbstack
diff options
context:
space:
mode:
authorDave Chapman <dave@dchapman.com>2009-02-22 18:25:16 +0000
committerDave Chapman <dave@dchapman.com>2009-02-22 18:25:16 +0000
commitdff46d20e6c495a345d4756f72ee65bf971c2726 (patch)
treef340cff309828214175f8b46d4a49a7cdf397a8a /firmware/usbstack
parent8dc70840d362ae0d3a2fe3086df60d6726896e47 (diff)
downloadrockbox-dff46d20e6c495a345d4756f72ee65bf971c2726.tar.gz
rockbox-dff46d20e6c495a345d4756f72ee65bf971c2726.zip
Commit my patch from FS#9940 - fix the invalid active flags in the Gigabeat S MBR on the fly in the UMS driver. It is hypothosized that actually changing these on the disk will make the OF more likely to reformat the data partition during recovery - but that is not confirmed. So we play it safe.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@20085 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/usbstack')
-rw-r--r--firmware/usbstack/usb_storage.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/firmware/usbstack/usb_storage.c b/firmware/usbstack/usb_storage.c
index 86b47cf653..9be2d5d241 100644
--- a/firmware/usbstack/usb_storage.c
+++ b/firmware/usbstack/usb_storage.c
@@ -283,6 +283,23 @@ static enum {
283 SENDING_CSW 283 SENDING_CSW
284} state = WAITING_FOR_COMMAND; 284} state = WAITING_FOR_COMMAND;
285 285
286#ifdef TOSHIBA_GIGABEAT_S
287
288/* The Gigabeat S factory partition table contains invalid values for the
289 "active" flag in the MBR. This prevents at least the Linux kernel from
290 accepting the partition table, so we fix it on-the-fly. */
291
292static void fix_mbr(unsigned char* mbr)
293{
294 unsigned char* p = mbr + 0x1be;
295
296 p[0x00] &= 0x80;
297 p[0x10] &= 0x80;
298 p[0x20] &= 0x80;
299 p[0x30] &= 0x80;
300}
301#endif
302
286static bool check_disk_present(IF_MV_NONVOID(int volume)) 303static bool check_disk_present(IF_MV_NONVOID(int volume))
287{ 304{
288#ifdef USB_USE_RAMDISK 305#ifdef USB_USE_RAMDISK
@@ -985,6 +1002,12 @@ static void handle_scsi(struct command_block_wrapper* cbw)
985 MIN(BUFFER_SIZE/SECTOR_SIZE, 1002 MIN(BUFFER_SIZE/SECTOR_SIZE,
986 cur_cmd.count), 1003 cur_cmd.count),
987 cur_cmd.data[cur_cmd.data_select]); 1004 cur_cmd.data[cur_cmd.data_select]);
1005
1006#ifdef TOSHIBA_GIGABEAT_S
1007 if (cur_cmd.sector == 0) {
1008 fix_mbr(cur_cmd.data[cur_cmd.data_select]);
1009 }
1010#endif
988#endif 1011#endif
989 send_and_read_next(); 1012 send_and_read_next();
990 } 1013 }