diff options
author | jpeg729 <jpeg729@gmail.com> | 2013-06-11 17:33:20 +0200 |
---|---|---|
committer | jpeg729 <jpeg729@gmail.com> | 2013-06-21 22:18:25 +0200 |
commit | eaa90408a32181bc47bc35bfbd7017dff3a58dc6 (patch) | |
tree | dc0dfe493181ca481d395eb71b9b8062b29450b2 | |
parent | 855d6a6c1f7c54ef073caac3f6c5f9b1ed72eb4d (diff) | |
download | kernel_samsung_smdk4412-eaa90408a32181bc47bc35bfbd7017dff3a58dc6.zip kernel_samsung_smdk4412-eaa90408a32181bc47bc35bfbd7017dff3a58dc6.tar.gz kernel_samsung_smdk4412-eaa90408a32181bc47bc35bfbd7017dff3a58dc6.tar.bz2 |
USB: f_mass_storage: 2048 block size for cdrom devices
Enables computer Bios's to recognize the cdrom device like most
other cdrom devices. This allows people to boot ISOs from their
phone.
Indentation corrected.
Change-Id: Ia3ff20cb5b40da71da9702695d2ff974727deda8
-rw-r--r-- | drivers/usb/gadget/f_mass_storage.c | 21 | ||||
-rw-r--r-- | drivers/usb/gadget/storage_common.c | 9 |
2 files changed, 13 insertions, 17 deletions
diff --git a/drivers/usb/gadget/f_mass_storage.c b/drivers/usb/gadget/f_mass_storage.c index ec1d520..51248e8 100644 --- a/drivers/usb/gadget/f_mass_storage.c +++ b/drivers/usb/gadget/f_mass_storage.c @@ -1074,7 +1074,11 @@ static int do_read(struct fsg_common *common) curlun->sense_data = SS_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE; return -EINVAL; } - file_offset = ((loff_t) lba) << 9; + if (curlun->cdrom) + file_offset = ((loff_t) lba) << 11; + else + file_offset = ((loff_t) lba) << 9; + /* Carry out the file reads */ amount_left = common->data_size_from_cmnd; @@ -1089,6 +1093,8 @@ static int do_read(struct fsg_common *common) bh->inreq->length = 0; return -EIO; /* No default reply */ } + if (curlun->cdrom) + amount_left <<= 2; for (;;) { /* @@ -1663,7 +1669,7 @@ static int do_read_capacity(struct fsg_common *common, struct fsg_buffhd *bh) put_unaligned_be32(curlun->num_sectors - 1, &buf[0]); /* Max logical block */ - put_unaligned_be32(512, &buf[4]); /* Block length */ + put_unaligned_be32(curlun->cdrom ? 2048 : 512, &buf[4]); /* Block length */ return 8; } @@ -1922,7 +1928,7 @@ static int do_read_format_capacities(struct fsg_common *common, put_unaligned_be32(curlun->num_sectors, &buf[0]); /* Number of blocks */ - put_unaligned_be32(512, &buf[4]); /* Block length */ + put_unaligned_be32(curlun->cdrom ? 2048 : 512, &buf[4]); /* Block length */ buf[4] = 0x02; /* Current capacity */ return 12; } @@ -2472,16 +2478,7 @@ static int do_scsi_command(struct fsg_common *common) common->data_size_from_cmnd = get_unaligned_be16(&common->cmnd[7]); reply = check_command(common, 10, DATA_DIR_TO_HOST, -#if defined(CONFIG_USB_CDFS_SUPPORT) -#ifdef _SUPPORT_MAC_ (0xf<<6) | (1<<1), 1, -#else - (7<<6) | (1<<1), 1, -#endif -#else - (7<<6) | (1<<1), 1, -#endif - "READ TOC"); if (reply == 0) reply = do_read_toc(common, bh); diff --git a/drivers/usb/gadget/storage_common.c b/drivers/usb/gadget/storage_common.c index 70a474c..d6bf253 100644 --- a/drivers/usb/gadget/storage_common.c +++ b/drivers/usb/gadget/storage_common.c @@ -701,10 +701,10 @@ static int fsg_lun_open(struct fsg_lun *curlun, const char *filename) num_sectors = size >> 9; /* File size in 512-byte blocks */ min_sectors = 1; if (curlun->cdrom) { - num_sectors &= ~3; /* Reduce to a multiple of 2048 */ - min_sectors = 300*4; /* Smallest track is 300 frames */ - if (num_sectors >= 256*60*75*4) { - num_sectors = (256*60*75 - 1) * 4; + num_sectors >>= 2; /* Reduce to a multiple of 2048 */ + min_sectors = 300; /* Smallest track is 300 frames */ + if (num_sectors >= 256*60*75) { + num_sectors = (256*60*75 - 1); LINFO(curlun, "file too big: %s\n", filename); LINFO(curlun, "using only first %d blocks\n", (int) num_sectors); @@ -759,7 +759,6 @@ static void store_cdrom_address(u8 *dest, int msf, u32 addr) { if (msf) { /* Convert to Minutes-Seconds-Frames */ - addr >>= 2; /* Convert to 2048-byte frames */ addr += 2*75; /* Lead-in occupies 2 seconds */ dest[3] = addr % 75; /* Frames */ addr /= 75; |