aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjpeg729 <jpeg729@gmail.com>2013-06-11 17:33:20 +0200
committerjpeg729 <jpeg729@gmail.com>2013-06-21 22:18:25 +0200
commiteaa90408a32181bc47bc35bfbd7017dff3a58dc6 (patch)
treedc0dfe493181ca481d395eb71b9b8062b29450b2
parent855d6a6c1f7c54ef073caac3f6c5f9b1ed72eb4d (diff)
downloadkernel_samsung_smdk4412-eaa90408a32181bc47bc35bfbd7017dff3a58dc6.tar.gz
kernel_samsung_smdk4412-eaa90408a32181bc47bc35bfbd7017dff3a58dc6.tar.bz2
kernel_samsung_smdk4412-eaa90408a32181bc47bc35bfbd7017dff3a58dc6.zip
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.c21
-rw-r--r--drivers/usb/gadget/storage_common.c9
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 ec1d520ba15..51248e80f7f 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 70a474c5266..d6bf253aeed 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;