aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/cdrom/cdrom.c
diff options
context:
space:
mode:
authorvchannaiah <vanitha.channaiah@in.bosch.com>2016-06-29 08:18:25 -0400
committerJens Axboe <axboe@fb.com>2016-07-12 11:24:50 -0400
commitbf294e833b3e670450cdc013242d45a4d2b8d395 (patch)
tree3e64868a26493135f75b880a84ad1e1e2184d7d8 /drivers/cdrom/cdrom.c
parent54adc01055b75ec8769c5a36574c7a0895c0c0b2 (diff)
cdrom: support read sub-channel command in LBA format
userspace application can send READ_SUB_CHANNEL command with time bit enabled and disabled. The time bit allows selection of address reporting format. If the time bit is disabled the response is in logical block address(CDROM_LBA) format, represented as a 32-bit integer with ms-byte first. If the time bit is enabled the response is in time format i.e., minutes, second, frame (CDROM_MSF) format. Signed-off-by: vchannaiah <vanitha.channaiah@in.bosch.com> Signed-off-by: Mahendran Kuppusamy <mahendran.kuppusamy@in.bosch.com> [veeraiyan.chidambaram@in.bosch.com: updated Documentation/ioctl/cdrom.txt] Signed-off-by: Veeraiyan Chidambaram <veeraiyan.chidambaram@in.bosch.com> Signed-off-by: Jens Axboe <axboe@fb.com>
Diffstat (limited to 'drivers/cdrom/cdrom.c')
-rw-r--r--drivers/cdrom/cdrom.c28
1 files changed, 19 insertions, 9 deletions
diff --git a/drivers/cdrom/cdrom.c b/drivers/cdrom/cdrom.c
index 1b257ea9776a..5d475b3a0b2e 100644
--- a/drivers/cdrom/cdrom.c
+++ b/drivers/cdrom/cdrom.c
@@ -2032,7 +2032,7 @@ static int cdrom_read_subchannel(struct cdrom_device_info *cdi,
2032 2032
2033 init_cdrom_command(&cgc, buffer, 16, CGC_DATA_READ); 2033 init_cdrom_command(&cgc, buffer, 16, CGC_DATA_READ);
2034 cgc.cmd[0] = GPCMD_READ_SUBCHANNEL; 2034 cgc.cmd[0] = GPCMD_READ_SUBCHANNEL;
2035 cgc.cmd[1] = 2; /* MSF addressing */ 2035 cgc.cmd[1] = subchnl->cdsc_format;/* MSF or LBA addressing */
2036 cgc.cmd[2] = 0x40; /* request subQ data */ 2036 cgc.cmd[2] = 0x40; /* request subQ data */
2037 cgc.cmd[3] = mcn ? 2 : 1; 2037 cgc.cmd[3] = mcn ? 2 : 1;
2038 cgc.cmd[8] = 16; 2038 cgc.cmd[8] = 16;
@@ -2041,17 +2041,27 @@ static int cdrom_read_subchannel(struct cdrom_device_info *cdi,
2041 return ret; 2041 return ret;
2042 2042
2043 subchnl->cdsc_audiostatus = cgc.buffer[1]; 2043 subchnl->cdsc_audiostatus = cgc.buffer[1];
2044 subchnl->cdsc_format = CDROM_MSF;
2045 subchnl->cdsc_ctrl = cgc.buffer[5] & 0xf; 2044 subchnl->cdsc_ctrl = cgc.buffer[5] & 0xf;
2046 subchnl->cdsc_trk = cgc.buffer[6]; 2045 subchnl->cdsc_trk = cgc.buffer[6];
2047 subchnl->cdsc_ind = cgc.buffer[7]; 2046 subchnl->cdsc_ind = cgc.buffer[7];
2048 2047
2049 subchnl->cdsc_reladdr.msf.minute = cgc.buffer[13]; 2048 if (subchnl->cdsc_format == CDROM_LBA) {
2050 subchnl->cdsc_reladdr.msf.second = cgc.buffer[14]; 2049 subchnl->cdsc_absaddr.lba = ((cgc.buffer[8] << 24) |
2051 subchnl->cdsc_reladdr.msf.frame = cgc.buffer[15]; 2050 (cgc.buffer[9] << 16) |
2052 subchnl->cdsc_absaddr.msf.minute = cgc.buffer[9]; 2051 (cgc.buffer[10] << 8) |
2053 subchnl->cdsc_absaddr.msf.second = cgc.buffer[10]; 2052 (cgc.buffer[11]));
2054 subchnl->cdsc_absaddr.msf.frame = cgc.buffer[11]; 2053 subchnl->cdsc_reladdr.lba = ((cgc.buffer[12] << 24) |
2054 (cgc.buffer[13] << 16) |
2055 (cgc.buffer[14] << 8) |
2056 (cgc.buffer[15]));
2057 } else {
2058 subchnl->cdsc_reladdr.msf.minute = cgc.buffer[13];
2059 subchnl->cdsc_reladdr.msf.second = cgc.buffer[14];
2060 subchnl->cdsc_reladdr.msf.frame = cgc.buffer[15];
2061 subchnl->cdsc_absaddr.msf.minute = cgc.buffer[9];
2062 subchnl->cdsc_absaddr.msf.second = cgc.buffer[10];
2063 subchnl->cdsc_absaddr.msf.frame = cgc.buffer[11];
2064 }
2055 2065
2056 return 0; 2066 return 0;
2057} 2067}
@@ -3022,7 +3032,7 @@ static noinline int mmc_ioctl_cdrom_subchannel(struct cdrom_device_info *cdi,
3022 if (!((requested == CDROM_MSF) || 3032 if (!((requested == CDROM_MSF) ||
3023 (requested == CDROM_LBA))) 3033 (requested == CDROM_LBA)))
3024 return -EINVAL; 3034 return -EINVAL;
3025 q.cdsc_format = CDROM_MSF; 3035
3026 ret = cdrom_read_subchannel(cdi, &q, 0); 3036 ret = cdrom_read_subchannel(cdi, &q, 0);
3027 if (ret) 3037 if (ret)
3028 return ret; 3038 return ret;