diff options
author | vchannaiah <vanitha.channaiah@in.bosch.com> | 2016-06-29 08:18:25 -0400 |
---|---|---|
committer | Jens Axboe <axboe@fb.com> | 2016-07-12 11:24:50 -0400 |
commit | bf294e833b3e670450cdc013242d45a4d2b8d395 (patch) | |
tree | 3e64868a26493135f75b880a84ad1e1e2184d7d8 /drivers/cdrom/cdrom.c | |
parent | 54adc01055b75ec8769c5a36574c7a0895c0c0b2 (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.c | 28 |
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; |