aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/gadget/f_mass_storage.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/gadget/f_mass_storage.c')
-rw-r--r--drivers/usb/gadget/f_mass_storage.c21
1 files changed, 9 insertions, 12 deletions
diff --git a/drivers/usb/gadget/f_mass_storage.c b/drivers/usb/gadget/f_mass_storage.c
index 884caa86c76..7f37fe2e425 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);